【问题标题】:Controlling WPF ListBox height without setting a specific value and while having row's height set to auto?控制 WPF ListBox 高度而不设置特定值并且将行的高度设置为自动?
【发布时间】: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 之后提到过它,而且效果很好。谢谢。

标签: c# wpf listbox height


【解决方案1】:

您应该能够将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>

【讨论】:

  • 太棒了!它就像一个魅力。我会将我的代码发布在我的原始帖子中,以便其他人可以看到我做了什么。非常感谢。
  • 我还有一个问题。我将如何考虑三个控件的边距高度?由于 ListBox 跨越了所有行,因此会出现轻微的错位,因此它不考虑其他三个控件之间的边距。
  • 你当然可以这样做,尽管它会为你做更多的工作。你没有理由不能让你的Converter 更复杂...我有一个为类似复杂的UI 布局添加double 值和Size 尺寸。因此,您也可以绑定到控件Margin 属性,并且您的Converter 必须记住输入可能是double 或 Thickness,在这种情况下,它必须从Thickness 中提取double。
  • 谢谢,我会试试的。现在,我只是选择了一条简单的路线。查看我编辑的帖子。
  • 不客气,感谢您使用该决议更新您的问题。我觉得这提高了本网站上帖子的质量。
猜你喜欢
  • 2013-09-06
  • 2023-04-04
  • 2013-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多