检查WPF DataGrid中的可见行

时间:2009-03-18 13:31:37

标签: c# .net wpf datagrid

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

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

4 个答案:

答案 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;