运行时的 WPF 高度

Posted

技术标签:

【中文标题】运行时的 WPF 高度【英文标题】:WPF Height at Runtime 【发布时间】:2011-08-23 23:05:38 【问题描述】:

我是 WPF 新手。我要解决的一个问题是如何在运行时获得正确的高度。

在我的应用程序中,我在后面的代码中动态地将用户控件添加到 Stackpanel。 Usercontrol 包含一些 Texblocks。然后将我的 Stackpanel 用作 BookPage 的内容,并将此 BookPage 添加到 Book(http://wpfbookcontrol.codeplex.com/)。我的 Stackpanel 的高度不应超过某个值。

我已经想通了,我可以使用 Measure & Arrange 来计算 Usercontrol 的 ActualSize & Height:

itemsa.Measure(new System.Windows.Size(double.PositiveInfinity,     double.PositiveInfinity));
itemsa.Arrange(new Rect(0, 0, 400, itemsa.DesiredSize.Height));

此时用户控件并未添加到 Stackpanel。 400 是我的用户控件不应超过的宽度,但确实如此,因为 Textblock 不会创建自动换行符。当我显示 Book 时,会创建换行符。

我应该怎么做才能解决这个问题?

提前致谢。

【问题讨论】:

只是一个问题:测量和安排?所有 UserControl 都有一个名为 RenderSize 的属性,保留渲染参数(RenderSize.WidthRenderSize.Height),或者您也可以使用属性 ActualHeightActualWidth 【参考方案1】:

不确定您是否正在寻找这个,但使用MaxHeight 属性,您可以限制控件的增长。

一般来说,没有必要重写 Measure 和 Arrange,布局系统非常强大,它为您提供了许多提供特定布局行为的 container-controls。

【讨论】:

我需要进行这个计算,因为我必须在第一个“完整”后开始将控件添加到新的 Stackpanel。 @TheJoelaut:也许 WrapPanel 会帮助你?如果这对我们没有用处,请尝试限制您的 Measure()-Call。 Measure 负责进行计算(布局系统的第一遍)。【参考方案2】:

为什么不为堆栈面板使用属性 MaxHeight?

ActualWidth 和 ActualHeight 也会告诉您控件的实际大小。

您确定需要所有这些计算吗?我的猜测是使用自动调整大小的 GridRows 或类似的东西会更好。

【讨论】:

【参考方案3】:

在我看来,您希望自定义面板以非常特定的方式进行布局。您可以从 Panel 继承一个新类,然后重写 MeasureOverride 和 ArrangeOverride 以确定可以添加的内容和位置。这也是您用于创建虚拟面板的方法,其中仅创建可见子项,并在滚动关闭时将其销毁。

如果您对此感兴趣,请告诉我,我将编辑帖子并提供示例。

【讨论】:

以上是关于运行时的 WPF 高度的主要内容,如果未能解决你的问题,请参考以下文章

运行时的动态节标题高度

在 UIStackView 中以编程方式添加内容时的 UIScrollView 高度

winform窗体运行时的大小和设计时不一致

混合模式程序集是针对运行时的“v2.0.50727”版本构建的

混合模式程序集是针对运行时的“2.0.50727”版本构建的,无法在 4.0 运行时中加载

winform窗体控件设计时的位置到运行后怎么发生了变化