Если записи имеют (или могут быть) фиксированную ширину, это легко: просто измените свой 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, но если вы хотите сделать это таким образом, вы можете создать скрытую сетку с тремя столбцами размером со звезду и столбцом с фиксированной шириной, а затем использовать привязку к ActualWidth первого столбец скрытой сетки.)
Более простой способ — создать простую пользовательскую панель, которая действует как UniformGrid по горизонтали, но как StackPanel по вертикали. Это очень простой подкласс Panel:
- MeasureOverride вычисляет желаемую ширину как 3 * максимальную ширину любого дочернего элемента
- MeasureOverride вычисляет желаемую высоту как сумму (max (высота каждой группы из 3))
- ArrangeOverride размещает дочерние элементы по 3 в строке, каждая DesiredWidth/3 справа от предыдущей, а следующая строка максимально (высота) ниже текущей строки.
Очевидно, что если вы создаете пользовательскую панель, вы не будете жестко кодировать «3» — вы сделаете ее свойством, возможно, DependencyProperty, чтобы вы могли легко изменить его и чтобы при необходимости вы могли повторно использовать свою панель в другом месте.
person
Ray Burns
schedule
16.07.2010