代码中的 WPF 自动高度

Posted

技术标签:

【中文标题】代码中的 WPF 自动高度【英文标题】:WPF Auto height in code 【发布时间】:2011-01-28 09:09:22 【问题描述】:

如何在 C# 代码中将 WPF 控件的 Height 属性的值设置为“Auto”?

<Grid.RowDefinitions>
    <RowDefinition />
    <RowDefinition Height="Auto" />
    <RowDefinition />
    <RowDefinition Height="Auto" />
    <RowDefinition />
    <RowDefinition Height="Auto" />
    <RowDefinition />
    <RowDefinition Height="Auto" />
    <RowDefinition />
</Grid.RowDefinitions>

我想在后面的代码中重现这种行为。有什么想法吗?

【问题讨论】:

【参考方案1】:

也许this link 会帮助你。

有时,您可能想要 以编程方式设置高度或 自动输入的 WPF 元素的宽度 代码。为此,只需使用 Double.NaN(非数字)值。

例如,在 C# 中:

this.txtName.Width = Double.NaN;

【讨论】:

不要在我的情况下工作。但我正在通过行为改变高度宽度(表达式混合 4.0 lib) 链接已失效,但您可以访问存档版本here Nimrod 的回答更加明确和容易理解。 获取“NaN”不是属性“MaxWidth”的有效值 我觉得 Nimrod 的答案是最干净的,现在应该是公认的答案(过去不确定 GridLength.Auto 是可能的)。还有GridLength.Star来填充剩余区域。【参考方案2】:

你可以使用

RowDefinition rd = new RowDefinition(); rd.Height = GridLength.Auto; ContentGrid.RowDefinitions.Add(rd);

【讨论】:

这个答案和接受的答案有什么不同吗?因为如果不是,这应该是不绕过框架的最佳答案。 根据反射器,GridLength.Auto是new GridLength(1.0, GridUnitType.Auto);因此不完全等同于接受的答案,但更具可读性。 这不像公认的答案那样普遍。并非所有控件都将 Height 属性实现为“GridLength”对象(结构)。对于那些只使用 double 这个答案的人来说是行不通的。而且这个问题也不是泛泛而谈,只是以网格为例。【参考方案3】:

虽然已通过代码隐藏(如所询问)回答了该问题,但对于没有 "auto" 的基本控件属性,这是 XAML 中的相同解决方案:

xmlns:sys="clr-namespace:System;assembly=mscorlib"

Height="x:Static sys:Double.NaN"

发布是因为谷歌在搜索 TextBox 的 XAML 解决方案时将我带到了这里(自动不存在)。

【讨论】:

以上是关于代码中的 WPF 自动高度的主要内容,如果未能解决你的问题,请参考以下文章

设置“自动”时获取 WPF 控件高度

WPF:将组件的高度绑定到另一个组件的高度

让 WPF Tabcontrol 高度假设最大项目的高度?

WPF TextBlock中的自动垂直滚动条?

WPF:将控件高度设置为填充网格行高

C# WPF:在高度属性设置为“自动”的 ListView 中防止水平滚动条覆盖最后一项