упаковка содержимого в wpf StackPanel

Можно ли обернуть содержимое в StackPanel?

Я знаю, что вместо этого мы можем использовать WrapPanel. Но по причинам изменения кода, я должен использовать StackPanel.

Итак, есть ли способ сделать элементы в StackPanel после, скажем, 5 элементов... Спасибо!

Ответ 1

Создайте вложенные StackPanel, которые содержат необходимое количество элементов.

В приведенном ниже примере у вас есть две строки, соответственно занятые элементами <StackPanel Orientation="Horizontal">, которые, в свою очередь, содержат пять элементов, которые будут отображаться горизонтально рядом друг с другом.

<StackPanel Orientation="Vertical">
    <StackPanel Orientation="Horizontal">
        <Item1 />
        <Item2 />
        <Item3 />
        <Item4 />
        <Item5 />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <Item1 />
        <Item2 />
        <Item3 />
        <Item4 />
        <Item5 />
    </StackPanel>
</StackPanel>

Ответ 2

Для меня простой WrapPanel работает отлично:

<WrapPanel Orientation="Horizontal" Width="500" />

Не внутри StackPanel или любого другого контейнера. И установка Ширина в постоянное значение может быть превосходной в некоторых случаях, потому что привязка ее к ActualWidth может предотвратить уменьшение размера (например, когда родительский контроль имеет размер меньше, WrapPanel нет)

Ответ 3

<StackPanel>
        <StackPanel.Style>
            <Style TargetType="{x:Type StackPanel}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type StackPanel}">
                            <WrapPanel/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </StackPanel.Style>
    </StackPanel>

Ответ 4

В зависимости от вашего сценария вы можете использовать UniformGrid. Несколько примеров также можно найти здесь.

Вы можете определить его для обертывания после 5 элементов, подобных этому.

<UniformGrid Columns="5">
 <Button />
 <Button />
 <Button />
</UniformGrid>

Каждый элемент будет, однако, иметь ту же самую ширину, поэтому не уверен, что это сработает для вас.

Ответ 5

Я не думаю, что вы можете сделать это без оберточной панели. Возможно, вы можете попробовать поместить wrapPanel внутри панели стека - установите его ширину на фактическую ширину панели стека. Вы можете связать его как Width="{Binding ActualWidth, ElementName=StackPanel1}"

Но это будет просто хак - я думаю, что панель обертки лучше всего подходит для ваших нужд.

Ответ 6

Я положил стековую панель над кнопкой. Это не повлияет на фон кнопки. Затем в коде VB я использовал Chr(12), чтобы указать перевод строки:

Button1.Content = "first line" + Chr(12) + "second line"

Вы можете добавить больше строк, используя Chr(12).