gpt4 book ai didi

c# - 如何在 WPF 中检索 DataGrid 内容的总高度?

转载 作者:行者123 更新时间:2023-11-30 17:11:51 26 4
gpt4 key购买 nike

我有一个数据网格:

<DataGrid x:Name="Foo" ... />

我想将元素的高度绑定(bind)到数据网格的高度。简单地执行 {Binding ElementName=Foo, Path=ActualHeight} 将不起作用,因为它需要 ScrollViewer 的高度,而不是数据网格内容的总高度。

最佳答案

您需要找到 DataGrid 的内部 ScrollViewer ,并绑定(bind)到它的 ViewportHeight

根据您使用此值执行的操作以及需要它的位置,可以通过多种方式完成此操作。

通常情况下,为了仅查看目的需要这种东西,所以我会把代码放在 CodeBehind 中查找 ViewPort 高度

例如,使用一些 VisualTreeHelpers ,你可以这样做:

// Find first child of type ScrollViewer in object Foo
var scrollViewer = VisualTreeHelpers.FindChild<ScrollViewer>(Foo);

// If object is found, set other control's height to ViewportHeight
if (scrollViewer != null)
{
MyControl.Height = scrollViewer.ViewportHeight;
}

我不记得是否有多个ScrollViewerDataGrid ...你必须使用类似 Snoop 的东西确定地找出来。如果存在,则 .FindChild() 过载按名称查找您应该能够使用的元素。名字也可以通过Snoop之类的东西获取。

这也可以在 Converter 中完成,你在那里传递 DataGrid到转换器,让它找到 ScrollViewerViewportHeight在转换器中

<Grid Height="{Binding ElementName=Foo, 
Converter={StaticResource GetDataGridContentHeight}}" />

编辑

我实际上做了一些测试,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 时有效你所有的项目都是一样的。

关于c# - 如何在 WPF 中检索 DataGrid 内容的总高度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11156592/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com