Как WPF StackPanel может заполняться вертикально снизу вверх? - PullRequest
31 голосов
/ 29 января 2009

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

Ответы [ 7 ]

44 голосов
/ 29 января 2009

Вроде так:

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

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

15 голосов
/ 17 декабря 2009

Или вы можете повернуть панель 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>
8 голосов
/ 29 января 2009

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

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

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

пример:

            var button = new Button();
            DockPanel.SetDock(button, Dock.Bottom);
3 голосов
/ 29 января 2009

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

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

Просто вставьте элемент в положение 0 вместо того, чтобы добавлять его.

2 голосов
/ 29 января 2009

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

1 голос
/ 17 декабря 2009

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

0 голосов
/ 25 марта 2010

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

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

...