WPF WrapPanel在ViewBox中的最大大小

时间:2012-04-06 18:15:35

标签: wpf wrappanel viewbox

在我的程序中,我在视图框中有一个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这样做,如果它们太高,物品会被包装成更多列,但这是一种hacky方式,我找到不同的物品组,MaxHeight需要是不同。

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

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的大小,这将占用屏幕上更多的空间。

1 个答案:

答案 0 :(得分: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

现在,如果对你来说非常重要的是它们按行而不是行排列,那么它有点棘手。这是一个真正的hacky方式来按列排列它们:

<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>

我不你可以告诉一个统一的网格来排列事物列。