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

时间:2010-03-18 14:18:23

标签: wpf xaml itemscontrol

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

<DataTemplate x:Key="myItemTemplate">
    <TextBlock Height="???" Text="{Binding Path=Description}" />
</DataTemplate>

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

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

如果可能的话,我宁愿在XAML中完全执行此操作,以保持我的ViewModel清除UI逻辑。

2 个答案:

答案 0 :(得分:7)

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

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Rows="{Binding Items.Count, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ItemsControl}}}" IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

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

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

<ItemsControl>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1" IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

答案 1 :(得分:0)

我将尝试记住这是一项智力练习,因为我对WPF很新。我毫不怀疑我会在适当的时候得到纠正。我认为你可以通过在高度值附加%符号来指定一个常数比例,即Height =“50%”。这是具有欺骗性的,因为它会将父元素内元素高度的所有数值相加,并将每个元素的大小作为其总和的比例。例如,高度=“50%”的三个文本块每个都有一个高度(50/150)* datatemplate的高度= 1/3。