我正在尝试类似windows 8瓷砖的东西,并希望显示不同宽度和/或高度的瓷砖。 WrapPanel
使每列的宽度和高度相等,在较小的项目周围留下空白。是否有一种方式或面板可以像StackPanel
一样显示项目,其中每个项目可以具有单独的尺寸并像WrapPanel
那样换行?
编辑:
这是我的ItemsControl
。我用简单的Border
和TextBlock
替换了Tile DataTemplate。宽度为auto
,Tiles看起来很好,除了WrapPanel
创建相同大小的单元格。
<ItemsControl ItemsSource="{Binding Path=Contents}" HorizontalContentAlignment="Left">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel Orientation="Vertical" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Border Background="#B1DBFC" Height="200px" BorderBrush="#404648" Margin="5">
<TextBlock VerticalAlignment="Center" Text="{Binding Path=Name}" />
</Border>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
您可以从图像中看到每列的width
是最宽项目的宽度。
如果我在边框上明确设置宽度,事情会变得更加难看。
答案 0 :(得分:9)
您正在寻找的行为是WrapPanel
的默认行为,如以下示例所示。
<WrapPanel >
<WrapPanel.Resources>
<Style TargetType="{x:Type Rectangle}">
<Setter Property="Width"
Value="80" />
<Setter Property="Height"
Value="80" />
<Setter Property="Margin"
Value="3" />
<Setter Property="Fill"
Value="#4DB4DD" />
</Style>
</WrapPanel.Resources>
<Rectangle Width="150" />
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle Width="200"/>
<Rectangle />
<Rectangle />
<Rectangle />
<Rectangle Width="220"/>
<Rectangle />
<Rectangle />
</WrapPanel>
产生以下结果:
如您所见,每件商品的宽度均得到尊重。
您的问题是由您在模板中设置WrapPanel
到Vertical
的方向造成的。这是从上到下而不是从左到右布置项目,这意味着它是您需要设置的Height
属性(或者您可以恢复为水平布局,如我的示例中所示) )。
将您的输出与我的屏幕截图进行比较,其中面板设置为水平方向;每个行是最高Rectangle
的大小。不相信我?尝试将其中一个Rectangle's
Height
属性设置为更大的值,您会发现行大小会增加,而Rectangles
也不会垂直排列。
阅读您的评论我认为最好的入门方式是执行以下操作:
WrapPanel
横向列出其内容。Height
。Height
的{{1}}限制在一定的大小,以便您不会获得垂直滚动条。 WrapPanel
的高度应使用以下公式计算:
((项目高度+上边距+下边距)x行数))
每个项目的宽度也需要一点点思考,以便面板像横向接口一样水平放置物品(排成一行而不是交错排列)。
有两种瓷砖尺寸;小的是80px宽,大的是166px宽。 大瓷砖的宽度如下:
(项目宽度* 2)+(左边距+右边距)
这可确保瓷砖正确排列。
所以现在我的XAML看起来像这样:
WrapPanel
产生以下结果:
这应该为您提供足够的信息以开始将其重新计算为完全控制。如果您这样做,请记住以下几点: