我有一个列表框,我在其中显示来自数据库的记录。它在一个列中一个接一个地出现。如何以编程方式将记录放置为 3 行和 3 列,即一行中的 3 条记录,之后是一行中的 3 条记录。请建议?
谢谢。
我有一个列表框,我在其中显示来自数据库的记录。它在一个列中一个接一个地出现。如何以编程方式将记录放置为 3 行和 3 列,即一行中的 3 条记录,之后是一行中的 3 条记录。请建议?
谢谢。
如果记录是(或可以是)固定宽度,这很容易:只需将 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>
如果您需要将可用宽度除以三,并且您知道所有项目的高度完全相同(或者如果您对所有行都可以作为任何项目的最大高度),那么使用 UniformGrid 有一个非常简单的解决方案没有指定高度:
<ListBox ... >
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<UniformGrid Width="3" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
...
</ListBox>
如果您想将可用宽度除以 3 以获得项目宽度,但在垂直方向上尽可能紧密地堆叠项目,这在纯 XAML 中是可能的,但很棘手。(我不建议在纯 XAML 中执行此操作,但如果您想这样做,您可以创建一个隐藏的 Grid,其中包含三个星形大小的列和一个固定宽度的列,然后使用绑定到第一个的 ActualWidth隐藏网格的列。)
一种更简单的方法是创建一个简单的自定义面板,该面板在水平方向上类似于 UniformGrid,但在垂直方向上类似于 StackPanel。这是一个非常简单的 Panel 子类:
显然,如果您设计一个自定义面板,您不会对“3”进行硬编码——您可以将其设为属性,可能是 DependencyProperty,这样您就可以轻松更改它,这样您就可以在需要时在其他地方重用您的面板。