1

我有一个列表框,我在其中显示来自数据库的记录。它在一个列中一个接一个地出现。如何以编程方式将记录放置为 3 行和 3 列,即一行中的 3 条记录,之后是一行中的 3 条记录。请建议?

谢谢。

4

1 回答 1

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>

如果您需要将可用宽度除以三,并且您知道所有项目的高度完全相同(或者如果您对所有行都可以作为任何项目的最大高度),那么使用 UniformGrid 有一个非常简单的解决方案没有指定高度:

<ListBox ... >
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <UniformGrid Width="3" />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  ...
</ListBox>

如果您想将可用宽度除以 3 以获得项目宽度,但在垂直方向上尽可能紧密地堆叠项目,这在纯 XAML 中是可能的,但很棘手。(我不建议在纯 XAML 中执行此操作,但如果您想这样做,您可以创建一个隐藏的 Grid,其中包含三个星形大小的列和一个固定宽度的列,然后使用绑定到第一个的 ActualWidth隐藏网格的列。)

一种更简单的方法是创建一个简单的自定义面板,该面板在水平方向上类似于 UniformGrid,但在垂直方向上类似于 StackPanel。这是一个非常简单的 Panel 子类:

  • MeasureOverride 将所需宽度计算为任何孩子的 3* 最大宽度
  • MeasureOverride 将所需高度计算为 sum(max(每组 3 个的高度))
  • ArrangeOverride 每行布置 3 个子代,每个 DesiredWidth/3 在前一个的右侧,下一行从当前行向下最大(高度)

显然,如果您设计一个自定义面板,您不会对“3”进行硬编码——您可以将其设为属性,可能是 DependencyProperty,这样您就可以轻松更改它,这样您就可以在需要时在其他地方重用您的面板。

于 2010-07-16T06:38:35.963 回答