我有一个WPF DataGrid
,当屏幕上有太多行要查看时,它会得到一个垂直滚动条。我想知道的是,如果有一种方法可以知道用户滚动时顶部可见行是什么。
理想情况下,我希望能够连接一个事件以了解用户何时滚动和滚动,检查顶部可见行是什么,以便更新某些信息。
答案 0 :(得分:3)
使用以下方法对我有用:
// 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;
答案 1 :(得分:3)
如何在DataGrid的ScrollViewer上订阅ScrollViewer.ScrollChanged事件?它的事件参数非常广泛,描述了ScrollViewer移动了多少以及它的新垂直偏移量。另外,根据MSDN:
如果CanContentScroll为true,则ExtentHeight,ScrollableHeight,ViewportHeight和VerticalOffset属性的值为项目数。如果CanContentScroll为false,则这些属性的值为Device Independent Pixels。
CanContentScroll确实是用于DataGrid的ScrollViewer的情况。
您所要做的就是找到ScrollViewer:
ScrollViewer scrollview = FindVisualChild<ScrollViewer>(dataGrid);
使用可在各个地方找到的FindVisualChild实现(例如:Finding control within WPF itemscontrol)。
答案 2 :(得分:0)
这是一种过于复杂的方式,但它可能有效。首先,继承DataGridRowsPresenter并覆盖OnViewportOffsetChanged method。然后,复制datagrid的标准控件模板,并将DataGridRowsPresenter替换为您自己的。我将相对于视口的行的命中测试的详细信息留给您; - )。
具体来说,你想要完成什么?也许我们可以提出一个更好的方法,因为这可能非常脆弱,需要一堆额外的工作(即如果他们更新控制模板保持同步)。
答案 3 :(得分:0)
检测滚动就像
一样简单<DataGrid ScrollViewer.ScrollChanged="DataGrid_ScrollChanged" />
现在你必须得到ScrollViewer实例:
void DataGrid_ScrollChanged(object sender, RoutedEventArgs e)
{
var scroll = FindVisualChild<ScrollViewer>((DependencyObject)sender);
...
}
(不确定FindVisualChild的来源在哪里,但有很多实现,例如here)
然后你可以
int firstRow = (int)scroll.VerticalOffset;
int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1;