Проверьте видимые строки в WPF DataGrid - PullRequest
7 голосов
/ 18 марта 2009

У меня есть WPF DataGrid, который, когда слишком много строк для просмотра на экране, получает вертикальную полосу прокрутки. Я хотел бы знать, есть ли способ узнать, какая строка видна сверху, когда пользователь выполняет прокрутку.

В идеале я хотел бы иметь возможность подключить событие, чтобы знать, когда пользователь выполняет прокрутку и прокрутку, проверить, какая верхняя видимая строка находится, чтобы обновить некоторую информацию.

Ответы [ 4 ]

3 голосов
/ 14 мая 2009

Используя следующий метод работал для меня:

// mHorizontalScrollBar is the HorizontalScrollBar subclass control's instance

// Get the total item count
nTotalCount = DataGrid1.Items.Count; 

// Get the first visible row index 
nFirstVisibleRow = mHorizontalScrollBar.Value;

// Get the last visible row index
nLastVisibleRow = nFirstVisibleRow + nTotalCount - mHorizontalScrollBar.Maximum;
3 голосов
/ 29 сентября 2011

Как насчет подписки на событие ScrollViewer.ScrollChanged в ScrollViewer DataGrid? Аргументы события для него довольно обширны, они описывают, насколько сильно переместился ScrollViewer и каково его новое вертикальное смещение. Также по данным MSDN:

Если CanContentScroll имеет значение true, значения свойств ExtentHeight, ScrollableHeight, ViewportHeight и VerticalOffset являются числом элементов. Если CanContentScroll имеет значение false, значения этих свойств являются независимыми от устройства пикселями.

CanContentScroll действительно подходит для ScrollViewer для DataGrid.

Все, что вам нужно сделать, это найти ScrollViewer:

ScrollViewer scrollview = FindVisualChild<ScrollViewer>(dataGrid);

с использованием реализации FindVisualChild, которую можно найти в разных местах (например, здесь: Поиск элемента управления в элементе управления WPF ).

0 голосов
/ 21 сентября 2016

Обнаружение прокрутки так же просто, как

<DataGrid ScrollViewer.ScrollChanged="DataGrid_ScrollChanged" />

Теперь вы должны получить экземпляр ScrollViewer:

void DataGrid_ScrollChanged(object sender, RoutedEventArgs e)
{
    var scroll = FindVisualChild<ScrollViewer>((DependencyObject)sender);
    ...
}

(Не уверен, где находится источник FindVisualChild, но существует множество реализаций, например, здесь )

И тогда вы можете

int firstRow = (int)scroll.VerticalOffset;
int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1;
0 голосов
/ 18 марта 2009

Это своего рода слишком сложный способ сделать это, но это может сработать. Сначала создайте подкласс DataGridRowsPresenter и переопределите метод OnViewportOffsetChanged . Затем продублируйте стандартный шаблон элемента управления для сетки данных и замените DataGridRowsPresenter своим собственным. Я оставляю вам подробности тестирования попаданий для строки относительно области просмотра; -).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...