将 ListBox 限制为仅在其所在的面板增长时才增长,而不在列表中添加更多项时增长

本文关键字:列表 添加 ListBox | 更新日期: 2023-09-27 18:31:13

在xaml中,我有这个:

<!--The listing of the items-->
<ListBox DockPanel.Dock="Left" ItemsSource="{Binding View}"
        IsSynchronizedWithCurrentItem="True"
        SelectionMode="Single"
        Width="{Binding Source={StaticResource ListWidth}}"
        x:Name="lstBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
                <Run Text="{Binding alabel}" />
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

在列表框所在的同一个 DockPanel 中,我有另一个可以改变高度(但不是动态)的控件,我们称此控件为 B。因此,列表框和 B 位于一个用户控件中,我们称之为 Master。

当 Master 实例化时,B 的高度被设置,然后它不再变化。在我的窗口里,我可以有几个大师,有些比其他的更高。如果列表框占用与 B 相同的高度,则可以。如果 B 随着项目的添加而增长,这是不行的。

那么,从本质上讲,我如何实现以下目标:

    仅当列表框由于
  • 另一个控件的大小增加而增长时,列表框才能增长
  • 如果我只是向列表框添加更多项,则列表框无法增长。

将 ListBox 限制为仅在其所在的面板增长时才增长,而不在列表中添加更多项时增长

当我写这个问题时,我想到了答案。

解决方案是:

  1. 为控件 B 指定一个名称。
  2. 为列表框指定最小高度。
  3. 在列表框中,将其"高度"绑定为 B 的实际高度,并将模式绑定为 OneTimeOnly

因此:

<ListBox DockPanel.Dock="Left" ItemsSource="{Binding View}"
        IsSynchronizedWithCurrentItem="True"
        SelectionMode="Single"
        Width="{Binding Source={StaticResource ListWidth}}"
        Height="{Binding ElementName=controlB, Path=ActualHeight, Mode=OneTime}"
        x:Name="lstBox">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <TextBlock>
            <Run Text="{Binding thing}" />
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这会导致 ListBox 的大小只有一次,并且是控件 B 的大小;然后在添加项时再也不会增长。