我有一个列表框,我在其中显示数据库中的记录。它一个接一个地在一个列中。如何将记录按顺序排列为3行3列,即连续3行记录,连续3行记录之后。请建议吗?
感谢。
答案 0 :(得分:1)
如果记录是(或可以是)固定宽度,则很容易:只需将ListBox.ItemsPanel更改为WrapPanel,并将ListBox宽度设置为项目宽度的3倍以上:
<DataTemplate DataType="{x:Type my:CustomItem}">
<Border Width="100" ...>
...
</Border>
</DataTemplate>
...
<ListBox ... Width="320">
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>
如果您需要将可用宽度除以3并且您知道所有项目的高度完全相同(或者如果您的所有行都是任何项目的最大高度都可以),那么非常简单使用UniformGrid但没有指定高度的解决方案:
<ListBox ... >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Width="3" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>
如果要将可用宽度除以3以获得项目宽度,但是尽可能垂直地堆叠项目,则纯XAML中可能会很棘手。 (我不建议在纯XAML中使用它,但如果你想这样做,你可以创建一个隐藏的网格,其中包含三个星大小的列和一个固定宽度的列,然后使用绑定到第一个的ActualWidth隐藏网格的列。)
更简单的方法是创建一个简单的自定义面板,其水平方向与UniformGrid相同,但垂直方向与StackPanel相同。这是一个非常简单的Panel子类:
显然,如果你设计一个自定义面板你不会硬编码“3” - 你会把它变成一个属性,可能是DependencyProperty,所以你可以轻松地改变它,以便你可以在其他地方重用你的面板是