Как WPF StackPanel может заполняться вертикально снизу вверх?

мне нужно иметь возможность заполнить stackpanel с buttons но кнопки должен появиться в нижней части stackpanel первым и заполнить вверх. Кнопки создаются динамически, и их количество неизвестно, поэтому visual hackery просто не будет работать. Я пробовал экспериментировать с вертикальными выравниваниями, но безрезультатно.

7 ответов


вот так:

<StackPanel VerticalAlignment="Bottom">
    ...
</StackPanel>

и чтобы заполнить кнопки вверх, вы должны вставить кнопки в положение 0, а не добавлять их.


или вы можете повернуть StackPanel на 180 градусов, чтобы получить кнопки для стека снизу вверх, а затем повернуть кнопки еще на 180 градусов, чтобы снова получить их правой стороной вверх:

<StackPanel>
    <!-- rotate all buttons inside this panel -->
    <StackPanel.Resources>
        <Style TargetType="Button">
            <Setter Property="LayoutTransform">
                <Setter.Value>
                    <RotateTransform Angle="180"/>
                </Setter.Value>
            </Setter>
        </Style>
    </StackPanel.Resources>

    <!-- rotate the stack panel -->
    <StackPanel.LayoutTransform>
       <RotateTransform Angle="180"/>
    </StackPanel.LayoutTransform>

    <!-- content -->
    <Button>1</Button>
    <Button>2</Button>

</StackPanel>

Другой альтернативой является использование DockPanel вместо этого.

просто установите LastChildFill в false на панели DockPanel.

затем установите прикрепленное свойство Dock для каждой кнопки, которую вы добавляете в нижней части перед добавлением в DockPanel.

пример :

            var button = new Button();
            DockPanel.SetDock(button, Dock.Bottom);

лучший способ решить проблему-реализовать пользовательский контейнер, полученный из stackpanel но быстрое и грязное решение, если элементы добавляются во время выполнения, является

    public Window1()
    {
        InitializeComponent();
        for (int i = 0; i < 10; i++)
        {
            Button btn = new Button();
            btn.Content = "Button " + i;
            MyStack.Children.Insert(0, btn);
        }
    }

просто вставьте элемент в положение 0 вместо их добавления.


Попробуйте поместить StackPanel в другой контейнер (не StackPanel; возможно, DockPanel) и выровнять его снизу. Затем, когда вы заполняете кнопки, поместите каждую новую в первую позицию.


Я обнаружил, что использование UniformGrid со столбцом=1 дает аккуратный заполняющий стек, или set Rows=1 дает аккуратный горизонтально заполненный стек. И добавление из индекса 0 будет работать снизу вверх.


люблю решение преобразования по Nir. Мне было интересно, можно ли это сделать с помощью преобразований.

одно предостережение: Не используйте трюк преобразования для элемента управления на основе ScrollView, такого как ListBox, потому что операция полосы прокрутки будет инвертирована из содержимого. Смешно смотреть, пока ты не конечный пользователь. ;>