1

我有一个ItemsControl计划在其中托管水果对象的列表。我有一个Fruit对象列表,它们都有自己的DataTemplates。我有一个Grape对象,一个Orange对象和一个Kiwi对象。

我想使用 aUniformGrid以使所有单元格都具有相同的大小,但我希望Kiwi对象仅跨越 1 个单元格,我希望Grape跨越 2 个单元格(ColumnSpan = 2)并且我希望Orange控件跨越 4 个单元格(ColumnSpan = 2RowSpan = 2

我怎样才能做到这一点?

4

2 回答 2

5

a 中的项目UniformGrid不能跨越多个单元格。

为什么不使用常规Grid而不是设置行/列的高度/宽度,*以便它们的大小都相同?如果您希望单元格是高度与宽度匹配的完美正方形,请务必将 Grid 绑定HeightWidth,反之亦然。

应该注意的是,您需要在 中应用 Grid 定位属性ItemContainerStyle,而不是在项目本身上,因为在将该项目添加到之前,ItemsControl将每个元素包装在 a中(有关更多详细信息,请参阅我的博客文章ContentPresenterItemsPanel

<ItemsControl ItemsSource="{Binding MyCollection}">
    <!-- ItemsPanelTemplate -->
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>

    <!-- ItemContainerStyle -->
    <ItemsControl.ItemContainerStyle>
        <Style>
            <Setter Property="Grid.Column" 
                    Value="{Binding ColumnIndex}" />
            <Setter Property="Grid.Row" 
                    Value="{Binding RowIndex}" />

            <!-- Can either use a DataTrigger to determine these values, 
                 or store them on the object itself -->
            <Setter Property="Grid.RowSpan" 
                    Value="{Binding RowSpan}" />
            <Setter Property="Grid.ColumnSpan" 
                    Value="{Binding ColumnSpan}" />
        </Style>
    </ItemsControl.ItemContainerStyle>
</ItemsControl>
于 2012-06-12T16:05:16.507 回答
0

您不能在统一网格中进行行或列跨越 - 请参阅下面的 stackoverflow 问题

WPF:是否可以在 UniformGrid 中进行行/列跨度?

但是,如果您的项目具有统一的尺寸,则可以使用 WrapPanel 实现类似的效果。这是一个例子

<ItemsControl Width="300">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.Items>
        <Rectangle Fill="Orange" Height="100" Width="100" />
        <Rectangle Fill="Red" Height="100" Width="100" />
        <Rectangle Fill="Blue" Height="100" Width="100" />
        <Rectangle Fill="Green" Height="100" Width="200" />
        <Rectangle Fill="Yellow" Height="100" Width="100" />
        <Rectangle Fill="Brown" Height="100" Width="100" />
        <Rectangle Fill="Black" Height="100" Width="200" />
    </ItemsControl.Items>
</ItemsControl>
于 2012-06-12T15:45:04.567 回答