C# 控制WPF列表框高度,无需设置特定值,同时具有行';s高度设置为自动?
我很好奇这是否可以做到。。。我有一个包含几行的网格。出于各种设计原因,我希望将行的高度保持为C# 控制WPF列表框高度,无需设置特定值,同时具有行';s高度设置为自动?,c#,wpf,listbox,height,C#,Wpf,Listbox,Height,我很好奇这是否可以做到。。。我有一个包含几行的网格。出于各种设计原因,我希望将行的高度保持为height=“Auto”。Listbox跨越网格中的三行。除非我将其高度设置为特定的值(height=“70”),否则在添加或删除项目时,它将动态调整其高度,同时也调整行的高度,因为行的高度设置为Auto。这是一种正常的行为,一切都正常运转——我只是想避开这种行为 有没有办法让这个列表框在它所占用的行的当前高度内垂直拉伸,而不直接控制行的高度?我知道row的height属性被设置为Auto会导致它根据其
height=“Auto”
。Listbox跨越网格中的三行。除非我将其高度设置为特定的值(height=“70”
),否则在添加或删除项目时,它将动态调整其高度,同时也调整行的高度,因为行的高度设置为Auto
。这是一种正常的行为,一切都正常运转——我只是想避开这种行为
有没有办法让这个列表框在它所占用的行的当前高度内垂直拉伸,而不直接控制行的高度?我知道row的height属性被设置为Auto
会导致它根据其内容进行扩展和收缩,但我想知道是否可以阻止我的列表框拥有该权限,同时允许其他项执行正常操作
我可以在ListBox上获得相当精确的静态高度,以使整个界面看起来很好,但我希望它可以拉伸并占据指定行的空间,同时将行的高度保持为Auto
,并受除该ListBox之外的任何其他内容的影响
如果做不到,有没有人对我的目标有什么建议
编辑:
基于谢里登出色的回答,我能够达到预期的结果。下面是使这一切发生的代码(另请参见Sheridan的代码)
公共类SumConverter:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,
System.Globalization.culture(信息文化)
{
双和=0;
foreach(值中的var val)
{
总和+=(双)val;
}
回报金额;
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,
System.Globalization.culture(信息文化)
{
抛出新的NotImplementedException();//尚未实现此部分。。。
}
}
您应该能够将ListBox.Height
属性数据绑定到占用相同空间的另一个控件的实际高度
:
<ListBox Height="{Binding ActualHeight, ElementName=AnotherControlOfTheRightHeight}" />
你试过将垂直对齐设置为拉伸吗?@jugg1es我试过了。同样的行为。这是因为没有任何东西约束ListBox的高度,并且由于其height=“Auto”设置,行也随之拉伸。您知道该行中的哪个控件具有最大高度吗?你试过将listbox的高度绑定到此控件的高度吗?@Athari不,我没有。但在你和谢里登提到它之后,我发现它工作得很好。谢谢,太棒了!它就像一个符咒。我将把我的代码发布在我的原始帖子中,这样其他人就可以看到我做了什么。非常感谢。我还有一个问题。我如何解释这三个控件的边距高度呢?由于ListBox跨越了三行,因此会出现轻微的错位,因此它不考虑其他三个控件之间的间距。您当然可以这样做,尽管这会为您带来更多的工作。没有理由不让转换器变得更复杂。。。我有一个为类似复杂的UI布局添加了double
值和Size
维度。因此,您也可以绑定到controlsMargin
属性,您的转换器
必须记住,输入可能是double
或Thickness
,在这种情况下,它必须从Thickness
中提取double
。谢谢,我会尝试一下。现在,我只选择了一条简单的路线。请参阅我编辑的帖子。欢迎并感谢您用决议更新您的问题。我觉得这提高了这个网站上帖子的质量。
<ListBox Height="{Binding ActualHeight, ElementName=AnotherControlOfTheRightHeight}" />
<ListBox>
<ListBox.Height>
<MultiBinding Converter="{StaticResource SumConverter}">
<Binding Path="ActualHeight" ElementName="Control1" />
<Binding Path="ActualHeight" ElementName="Control2" />
<Binding Path="ActualHeight" ElementName="Control3" />
</MultiBinding>
</ListBox.Height>
</ListBox>