Csharp/C#教程:如何在WPF中检索DataGrid内容的总高度?分享


如何在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传递给转换器,并让它在转换器中找到ScrollViewerViewportHeight

  

编辑

我实际上做了一些测试,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

(0)
上一篇 2021年11月27日
下一篇 2021年11月27日

精彩推荐