Автопрокрутка DataGrid

192
24 ноября 2018, 19:50

Мне необходимо контролировать прокрутку DataGrid, т.е. решать какой элемент должен быть верхним отображаемым. Для этого я хочу использовать либо свойство CurrentItem либо метод ScrollIntoView(). Но все упирается в то, что я не могу получить индекс верхней строки. Есть ли какой-то вариант получить этот индекс?

Answer 1

Получите ScrollViewer вашего DataGrid:

public MainWindow()
{
    InitializeComponent();
    Loaded += (o, e) => scrollViewer = GetVisualChild<ScrollViewer>(MyDataGrid);
}
ScrollViewer scrollViewer;
private static T GetVisualChild<T>(DependencyObject parent) where T : Visual
{
    T child = null;
    int count = VisualTreeHelper.GetChildrenCount(parent);
    for (int i = 0; i < count; i++)
    {
        var v = (Visual)VisualTreeHelper.GetChild(parent, i);
        child = v as T;
        if (child == null) child = GetVisualChild<T>(v);
        if (child != null) break;
    }
    return child;
}

Что интересно, ScrollViewer внутри DataGrid отсчитывает вертикальное смещение в элементах, а не в координатах (как он обычно это делает).

Перед добавлением новых элементов запомните текущее смещение:

int verticalOffset;
verticalOffset = (int)scrollViewer.VerticalOffset;

А после добавления скорректируйте его (здесь x — количество добавленных элементов):

scrollViewer.ScrollToVerticalOffset(verticalOffset + x);

READ ALSO
Обновление данных в таблице Oracle C#

Обновление данных в таблице Oracle C#

Есть таблица следующего содержания

165
Заменить текст в xml на заданный

Заменить текст в xml на заданный

Есть файл xml который имеет вид :

149
Странное исключение в модульных тестах Convert.ToBolean

Странное исключение в модульных тестах Convert.ToBolean

Использую фреймворк msunitПри обычном запуске программы Convert

160