如何在WPF中检索DataGrid内容的总高度?
我有一个数据网格:
我想将元素的高度绑定到数据网格的高度。 简单地做{Binding ElementName=Foo, Path=ActualHeight}
将不起作用,因为它取得了ScrollViewer
的高度,而不是数据网格内容的总高度。
您需要找到DataGrid的内部ScrollViewer
,并绑定到它的ViewportHeight
根据您使用此值以及您需要的位置,可以通过多种方式完成此操作。
通常这种事情只是为了View-Only目的,所以我会把代码放在CodeBehind中查找ViewPort高度
例如,使用一些VisualTreeHelpers ,您可以执行以下操作:
// Find first child of type ScrollViewer in object Foo var scrollViewer = VisualTreeHelpers.FindChild(Foo); // If object is found, set other control's height to ViewportHeight if (scrollViewer != null) { MyControl.Height = scrollViewer.ViewportHeight; }
我不记得DataGrid
是否有多个ScrollViewer
……你必须使用像Snoop这样的东西才能确定。 如果存在,则.FindChild()
会超载以查找您应该能够使用的名称元素。 这个免费精选名字大全也可以通过像Snoop这样的东西获得。
这也可以在Converter
完成,您将DataGrid
传递给转换器,并让它在转换器中找到ScrollViewer
和ViewportHeight
编辑
我实际上做了一些测试,DataGrid的ScrollViewer
对大小的处理有点不同,可能是由于Virtualization
。 它似乎使用基于行数的相对大小。
我正在使用的测试DataGrid
有23行。 ScrollViewer.ExtentHeight
等于23, ScrollViewer.ViewportHeight
为3,意味着总共有23行,并且显示了3个完整的行。 ScrollViewer.ScrollableHeight
等于20,这意味着我可以从0滚动到20(因为显示了3个项目,它不需要转到23),并且ScrollViewer.VerticalOffset
被设置为我当前滚动到的任何项目。
因此,为了获得虚拟化ScrollViewer
中项目的实际内容高度,我认为您必须获取其中一个可见行的ActualHeight
,并将其乘以ScrollViewer.ExtentHeight
以获取内容的实际大小。 这仅适用于所有物品的Height
相同的情况。
您可以将DataGrid
包装在另一个ScrollViewer
,然后DataGrid的实际高度将是正确的。
然而,这会带来性能损失,无法利用DataGrid
的行虚拟化 。 您必须测试并查看这是否会对您的用例产生重大负面影响。
上述就是C#学习教程:如何在WPF中检索DataGrid内容的总高度?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/962705.html