Мне необходимо контролировать прокрутку DataGrid
, т.е. решать какой элемент должен быть верхним отображаемым. Для этого я хочу использовать либо свойство CurrentItem
либо метод ScrollIntoView()
. Но все упирается в то, что я не могу получить индекс верхней строки. Есть ли какой-то вариант получить этот индекс?
Получите 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);
Виртуальный выделенный сервер (VDS) становится отличным выбором
Использую фреймворк msunitПри обычном запуске программы Convert