控制WPF ListBox高度而不设置特定值并将行的高度设置为auto?

时间:2014-02-21 20:51:42

标签: c# wpf listbox height

我很好奇是否可以这样做...我有一个包含多行的网格。出于各种设计原因,我想将行的高度保持为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>

上面的代码也考虑了三个控件中两个的底部边距,因此所有内容都对齐

1 个答案:

答案 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>