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>

Ответ 1

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

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

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

Ответ 2

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

Вам понадобится:

  • Установите Width или MaxWidth на WrapPanel.
  • Используйте WrapPanel в качестве внешней панели вместо StackPanel.