如何在XAML中设置项目的高度,以便它们在父ItemsControl中始终占用相同比例的可用空间?

aov*_*ven 1 wpf xaml itemscontrol

我有一个带有以下ItemTemplate的ItemsControl:

<DataTemplate x:Key="myItemTemplate">
    <TextBlock Height="???" Text="{Binding Path=Description}" />
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何在模板中设置TextBlock的高度,以便自动假定ItemsControl.Height div ItemsCount垂直空间量?

当只有一个项目时,我希望它是容器的整个高度,当有两个时,每个应该是一半大小,依此类推.

如果可能的话,我宁愿在XAML中完全这样做,以保持我的ViewModel清除UI逻辑.

geh*_*hho 7

您可以使用a UniformGrid作为您ItemsPanelTemplateRows属性并将属性绑定到您的项目数ItemsControl,如下所示:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

我没有测试这段代码,所以你需要检查它,但我认为这个想法很清楚.

编辑:正如下面John所指出的,这段代码更容易:

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1" IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)

  • 实际上,它比这更简单.如果设置Columns ="1",UniformGrid将自动处理行计数.并且您需要使用ItemsControl.ItemsPanel而不是ItemTemplate. (4认同)