【发布时间】:2014-03-23 14:04:34
【问题描述】:
我很好奇这是否可以做到……我有一个包含多行的网格。由于各种设计原因,我想将行的高度保持为height="Auto"。列表框跨越网格内的三行。除非我将其高度设置为特定的值 (height="70"),否则在添加或删除项目时,它将动态调整其高度,同时还会调整行的高度,因为它们设置为 Auto。这是正常行为,一切正常运行——我只是想避开这种行为。
有没有办法让这个 ListBox 在它所占据的行的当前高度内垂直拉伸,而不能直接控制行的高度?我知道行的 height 属性设置为 Auto 会导致它根据其内容扩展和收缩,但我想知道是否可以阻止我的 ListBox 拥有该权限,同时允许其他项目执行正常操作。
我可以在 ListBox 上获得一个相当精确的静态高度,以使整个界面看起来不错,但我希望让它伸展并占据指定行的空间,同时保持行的高度为 Auto 并受除了该 ListBox 的任何其他内容。
如果无法完成,是否有人对我要完成的工作提出建议?
编辑:
基于 Sheridan 的出色回答,我能够达到预期的结果。这是实现这一切的代码(另请参阅 Sheridan 的代码)。
public class SumConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter,
System.Globalization.CultureInfo culture)
{
double sum = 0;
foreach (var val in values)
{
sum += (double)val;
}
return sum;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter,
System.Globalization.CultureInfo culture)
{
throw new NotImplementedException(); // Didn't implement this part yet...
}
}
<Window ....
xmlns:c="clr-namespace:DSTG.Converters
....>
<Window.Resources>
<c:HeightSumConverter x:Key="SumConverter"/>
<Window.Resources>
<ListBox>
<ListBox.Height>
<MultiBinding Converter="{StaticResource SumConverter}">
<Binding Path="ActualHeight" ElementName="txtDat1"/>
<Binding Path="Margin.Bottom" ElementName="txtDat1"/>
<Binding Path="ActualHeight" ElementName="txtDat2"/>
<Binding Path="Margin.Bottom" ElementName="txtDat2"/>
<Binding Path="ActualHeight" ElementName="txtDat3"/>
</MultiBinding>
</ListBox.Height>
</ListBox>
上面的代码还占了三个控件中两个的下边距,让一切都对齐
【问题讨论】:
-
您是否尝试将 VerticalAlignment 设置为 Stretch?
-
@jugg1es 我有。相同的行为。这是因为没有任何东西限制 ListBox 的高度,并且由于它的 height="Auto" 设置,行正在随之拉伸。
-
您知道该行中的哪个控件将具有最大高度吗?您是否尝试将列表框的高度绑定到此控件的高度?
-
@Athari 不,我没有。但我在你和 Sheridan 之后提到过它,而且效果很好。谢谢。