WrapPanel не переносится в StackPanel с горизонтальной ориентацией

Метки в приведенном ниже примере (WPF/XAML) просто выскакивают с экрана, переноса не происходит. Удаление ориентации работает, но не обеспечивает необходимой функциональности/внешнего вида. Любые идеи, как сделать перенос WrapPanel на текущий размер StackPanel?

<Window Height="300" Width="600">
    <StackPanel Orientation="Horizontal">
        <WrapPanel>
            <Label Height="28" Name="label1" Width="120">First Name</Label>
            <Label Height="28" Name="label2" Width="120">John</Label>
            <Label Height="28" Name="label3" Width="120">Last Name</Label>
            <Label Height="28" Name="label4" Width="120">Smith</Label>
            <!-- ...more labels!... -->
        </WrapPanel>
        <!-- ...other controls/panels... -->
    </StackPanel>
</Window>

person derGral    schedule 26.10.2009    source источник


Ответы (2)


Вы можете связать MaxWidth WrapPanel с ActualWidth StackPanel.

Я не пробовал это, но в основном:

<WrapPanel MaxWidth="{Binding ActualWidth, ElementName=myStackPanel}"/>

person NotDan    schedule 26.10.2009
comment
Кажется, это работает; Спасибо! Проблема в том, что в панели стека есть другие вещи, и их ширина не учитывается. Есть идеи, как с этим справиться? - person derGral; 30.10.2009
comment
Может быть, вместо этого вам следует использовать сетку или DockPanel? Или вы можете использовать мультипривязку и преобразователь привязки для выполнения некоторой пользовательской логики. - person NotDan; 31.10.2009

То, что вы делаете, невозможно из-за алгоритма, который StackPanel использует при горизонтальной компоновке. По сути, он будет спрашивать каждый дочерний элемент, насколько большим он хочет быть, и сколько места он ему запрашивает, сколько он ему даст.

Вам либо нужно:

  1. Установите Width или MaxWidth на WrapPanel.
  2. Используйте WrapPanel в качестве внешней панели вместо StackPanel.
person Drew Marsh    schedule 26.10.2009