Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

Так же:

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

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

Ответ 2

Или вы можете поворачивать 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>

Ответ 3

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

Просто установите для LastChildFill значение false на DockPanel.

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

пример:

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

Ответ 4

Лучший способ решить проблему - реализовать пользовательский контейнер, полученный из 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 вместо добавления.

Ответ 5

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

Ответ 6

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

Ответ 7

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

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