如何在WPF中获得折叠控件的宽度/高度

本文关键字:控件 高度 折叠 WPF | 更新日期: 2023-09-27 17:50:24

我想知道是否有一种简单的方法可以在运行时在WPF中获得控件的宽度,而控件是折叠的。

,当我使用控制。宽度将得到以下结果:-1.#IND和控制。actualWidth将返回0.0,因为它已折叠。

我想调整我的窗口大小,然后显示折叠的控件。

感谢

编辑:
一些细节

我有一个网格与2列在我的窗口,第一列持有选项卡控件,第二列持有扩展器控件。我想扩展我的窗口的宽度时展开扩展器控件,所以在第一列的内容将保持其大小

如何在WPF中获得折叠控件的宽度/高度

将控件放入容器(如ContentControl)中,并折叠容器而不是控件本身。然后,您应该能够简单地调用控件上的Measure(或使用DesiredSize属性)来确定它想要多少空间。

你希望得到多大的尺寸?

的大小不仅取决于控件,还取决于它的容器。因此,除非控件实际呈现,否则无法确定实际大小。

你可以把它设置为不可见,这样它就会根据自己的逻辑和容器的逻辑来调整大小。

编辑

在评论中,我们清楚地看到了需要控件大小的原因:

我有一个网格与2列在我的窗口中,第一列保存一个选项卡控件,第二列a保存an扩张器控制。我想扩展的窗口宽度展开器控件,使内容在第一列保持原来的大小。

我的回答:

设置窗口的SizeToContent为WidthAndHeight,并设置两个网格列的宽度为auto。这就够了。

我相信你处理这件事的方式是错误的。你可以设置窗口宽度和高度为"Auto",然后它会照顾所有的调整大小的东西。

当你直接设置任何控件的Width属性时,问题就出现了(相信我,我已经这样做了)。一旦你这样做了,你已经告诉WPF 放手调整逻辑,我知道我在做什么。

如果你认为有些东西没有在正确的时间调整大小,你可以给一些事件添加一个处理程序,然后调用control.InvalidateVisual()control.InvalidateMeasurement(),这将使它通过一个全新的布局通过

您必须调用控件或控件容器上的UpdateLayout方法。之后,事情可能会正常工作。

在UWP中,您可以通过使其可见一秒钟然后再次隐藏它来确定折叠控件的大小,更改是不明显的:

var oldVisibility = myBorder.Visibility;
myBorder.Visibility = Visibility.Visible;
myBorder.UpdateLayout();
var height = myBorder.RenderSize.Height;
myBorder.Visibility = oldVisibility;

标记为答案的帖子实际上不回答问题,它只是提供了一个解决方案。

要获取折叠控件的大小,您需要:

  1. 设置控件的可见性为隐藏(折叠后不会计算)。
  2. Call Measure(new Size)
  3. 控件的PositiveInfinity, Double.PositiveInfinity))方法。
  4. 从控件的DesiredSize属性中获取大小
  5. 然后你可以把你的控件折叠回来