在我的程序中,我在视图框中有一个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的大小,这将占用屏幕上更多的空间。
答案 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>
我不想你可以告诉一个统一的网格来排列事物列。