2

在我的程序中,我在视图框中有一个 WrapPanel。WrapPanel(实际上是 ItemsControl 的 ItemsPanelTemplate)包含一些可以是不同大小的绑定项。

<Viewbox Name="ViewWindow" Margin="10">
  <Grid>
    <ItemsControl ItemsSource="{Binding Path=Items}">
      <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
          <WrapPanel Orientation="Vertical" MaxHeight="600"/>
        </ItemsPanelTemplate>
      </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>

所有这一切的目标是我希望所有项目的大小都适合单个屏幕。Viewbox 通过缩放内容来处理这个问题,使它们都适合。WrapPanel 中的每个项目都是用户定义的文本,因此它们都可以是不同的大小。我试图用 WrapPanel 完成的是屏幕上的结果文本将尽可能大。我一直在通过设置 WrapPanel MaxHeight 来做到这一点,这样如果项目太高,它们就会被包裹到更多的列中,但这是一种很老套的方法,我发现对于不同的项目组,MaxHeight 需要是不同的。

作为我的意思的一个例子,想象 ItemsControl 绑定到的项目只是显示字母表中的每个字母。如果没有任何方法强制将项目包装到多列,您最终会得到一个非常高的列和非常小的文本,但是如果我们设置 WrapPanel 的 MaxHeight,那么我们可以像这样将项目强制到多列并且文本会在屏幕上变大:

A    F    K    P    U    Z
B    G    L    Q    V
C    H    M    R    W
D    I    N    S    X
E    J    O    T    Y

我对这一切都错了吗?有没有比 WrapPanel 更好的控件?我需要创建某种自定义面板来获得我想要的吗?

谢谢你尽你所能的帮助

编辑:

举一个为什么 UniformGrid 不起作用的例子,假设我有这 5 个项目(每个字母代表一个不同的项目)

A    C    E
A    C    E
A    D    E
B    D    E

使用 UniformGrid,所有项目都将采用项目 E 的大小,并且它们都会在屏幕上占据更多空间。

4

1 回答 1

2

这是否实现了您正在尝试做的事情:

        <ItemsControl ItemsSource="{Binding Path=Items}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
        </ItemsControl>

使用您的示例字母表,我将其布局如下:

A B C D E F
G H I J K L
M N O P Q R
S T U V W X
Y Z

现在,如果将它们按列而不是按行排列对您来说真的很重要,那么这有点棘手。这是让它们按列排列的一种非常老套的方法:

<ItemsControl ItemsSource="{Binding Path=Items}">
            <ItemsControl.ItemsPanel>
                <ItemsPanelTemplate>
                    <UniformGrid IsItemsHost="True"/>
                </ItemsPanelTemplate>
            </ItemsControl.ItemsPanel>
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding}">
                        <TextBlock.LayoutTransform>
                            <TransformGroup>
                                <ScaleTransform ScaleX="-1"/>
                                <RotateTransform Angle="-90"/>
                            </TransformGroup>
                        </TextBlock.LayoutTransform>
                    </TextBlock>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
            <ItemsControl.LayoutTransform>
                <TransformGroup>
                    <ScaleTransform ScaleX="-1"/>
                    <RotateTransform Angle="-90"/>
                </TransformGroup>
            </ItemsControl.LayoutTransform>
        </ItemsControl>

我不认为你可以告诉一个统一的网格首先排列事物列。

于 2012-04-06T18:28:07.587 回答