Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查WPF数据网格中的可见行_C#_.net_Wpf_Datagrid - Fatal编程技术网

C# 检查WPF数据网格中的可见行

C# 检查WPF数据网格中的可见行,c#,.net,wpf,datagrid,C#,.net,Wpf,Datagrid,我有一个WPFDataGrid,当屏幕上有太多行无法查看时,它会显示一个垂直滚动条。我想知道的是,当用户滚动时,是否有办法知道顶部可见行是什么 理想情况下,我希望能够连接一个事件,以了解用户何时滚动,并在滚动时,检查顶部可见行是什么,以便更新一些信息。这是一种过于复杂的方式,但它可能会工作。首先,子类DataGridRowsPresenter并重写。然后,复制datagrid的标准控件模板,并用自己的替换DataGridRowsPresenter。我将关于相对于视口的行的命中测试的详细信息留给您

我有一个WPF
DataGrid
,当屏幕上有太多行无法查看时,它会显示一个垂直滚动条。我想知道的是,当用户滚动时,是否有办法知道顶部可见行是什么


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

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


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

使用以下方法对我有效:

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

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

如果CanContentScroll为true,则ExtentheLight、ScrollableHeight、ViewportHeight和VerticalOffset属性的值为项目数。如果CanContentScroll为false,则这些属性的值与设备无关

CanContentScroll确实适用于DataGrid的ScrollViewer

您只需找到ScrollViewer:

ScrollViewer scrollview = FindVisualChild<ScrollViewer>(dataGrid);
ScrollViewer scrollview=FindVisualChild(数据网格);

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

检测滚动与

<DataGrid ScrollViewer.ScrollChanged="DataGrid_ScrollChanged" />

谢谢我通过使用动画放大网格中的内容(主要是字体)来解决这个问题。不太简单,但基本上是我想要的。我遇到了字体缩放的问题,当缩小字体时,列不会自动调整大小,因此它们仍然是较大字体的宽度。令人遗憾的是,WPFToolkit的当前版本中存在一个错误,当它们与星形大小的列混合时,自动调整列的大小工作得很奇怪。我们也看到了这种行为,只是从来没有费心去修复它。谢谢,事实上,如果我上面的评论毫无意义,那是因为我一直在处理两个不同的问题,一个是试图找出最上面一行,另一个是缩放数据网格。我放弃了最上面一行的内容,并告诉用户他们需要调整UI。这实际上是一个很好且可靠的方法。@DannyBeckett,“编辑”使答案完全无用(或者,非常不清楚),返回到原始答案。@Sinatr我不同意,我已回滚您的更改。如果您仍然不同意,请发布一个问题元堆栈交换,而不是开始一场回滚战。@DannyBeckett,在它成为一个干净的分步指南(我同意有点糟糕的语言)之前,我确信当时已经给出了赞成票。我现在遇到了同样的问题,当我在当前状态下尝试这个答案时,我没能让它起作用,甚至否决了它。然后我看到了你们的编辑并阅读了原始答案,这更清楚了。就这样吧。未来的读者无论如何都会看到我的评论(但不是所有人都能看到修订版,我想这不是我的问题。)。如何获得
mHorizontalScrollBar
?最后一行的正确索引是使用(int)scroll.VerticalOffset+(int)scroll.ViewportHeight-1;
void DataGrid_ScrollChanged(object sender, RoutedEventArgs e)
{
    var scroll = FindVisualChild<ScrollViewer>((DependencyObject)sender);
    ...
}
int firstRow = (int)scroll.VerticalOffset;
int lastRow = (int)scroll.VerticalOffset + (int)scroll.ViewportHeight + 1;