检查WPF DataGrid中的可见行

我有一个WPF DataGrid ,当屏幕上有太多行要查看时,它会得到一个垂直滚动条。 我想知道的是,如果有一种方法可以知道用户滚动时顶部可见行是什么。

理想情况下,我希望能够连接事件以了解用户何时滚动和滚动,检查顶部可见行是什么以更新某些信息。

如何在DataGrid的ScrollViewer上订阅ScrollViewer.ScrollChanged事件? 它的事件参数非常广泛,描述了ScrollViewer移动了多少以及它的新垂直偏移量是多少。 另外,根据MSDN:

如果CanContentScroll为true,则ExtentHeight,ScrollableHeight,ViewportHeight和VerticalOffset属性的值是项目数。 如果CanContentScroll为false,则这些属性的值为“设备无关像素”。

CanContentScroll确实是用于DataGrid的ScrollViewer的情况。

您所要做的就是找到ScrollViewer:

 ScrollViewer scrollview = FindVisualChild(dataGrid); 

使用FindVisualChild的实现,可以在不同的地方找到(比如这里: 在WPF itemscontrol中查找控件 )。

使用以下方法对我有用:

 // 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; 

这是一种过于复杂的方式,但它可能会起作用。 首先, inheritance DataGridRowsPresenter并覆盖OnViewportOffsetChanged方法 。 然后,复制datagrid的标准控件模板,并将DataGridRowsPresenter替换为您自己的。 我将相对于视口的行的命中测试的详细信息留给您;-)。

具体来说,你想要完成什么? 也许我们可以提出一个更好的方法,因为这可能非常脆弱,需要一堆额外的工作(即如果他们更新控制模板保持同步)。

检测滚动就像一样容易

  

现在你必须得到ScrollViewer实例:

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

(不确定FindVisualChild的起源在哪里,但有很多实现,例如这里 )

然后你就可以了

 int firstRow = (int)scroll.VerticalOffset; int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1;