我很好奇是否可以这样做...我有一个包含多行的网格。出于各种设计原因,我想将行的高度保持为height="Auto"
。列表框跨越网格中的三行。除非我将其高度设置为特定的(height="70"
),否则在添加或删除项目时,它会动态调整其高度,同时还会调整行的高度,因为它们设置为Auto
。这是一种正常行为,一切都正常运作 - 我只是想绕过这种行为。
有没有办法让这个ListBox在它占据的行的当前高度内垂直拉伸,而没有直接控制行的高度?我知道行的高度属性设置为Auto
会导致它根据其内容进行扩展和收缩,但我想知道是否可以阻止我的ListBox拥有该权限,同时允许其他项目执行正常操作
我可以在ListBox上获得一个相当精确的静态高度,以使整个界面看起来很好,但是我希望让它伸展并占据指定行的空间,同时保持行的高度为Auto
并且受列表框>以外的任何其他内容影响。
如果无法完成,是否有人对我想要完成的事情提出建议?
修改
根据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>
上面的代码也考虑了三个控件中两个的底部边距,因此所有内容都对齐
答案 0 :(得分:2)
您应该能够将ListBox.Height
属性数据绑定到占用相同空间的另一个控件的ActualHeight
:
<ListBox Height="{Binding ActualHeight, ElementName=AnotherControlOfTheRightHeight}" />
如果你没有另外一个控制跨越3行,你可以创建一个简单的IMultiValueConverter
,它返回输入值的总和,数据绑定到几个控件:
<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>