Мне нужно заполнить stackpanel
с помощью buttons
, но сначала кнопки должны появиться внизу панели стека и заполнить вверх. Кнопки создаются динамически и там неизвестное число из них, так что визуальный хакер просто не будет работать. Я пробовал экспериментировать с вертикальными выравниваниями, но безрезультатно.
Как WPF StackPanel может быть заполнен вертикально снизу вверх?
Ответ 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, потому что операция полосы прокрутки будет инвертирована из содержимого. Весело наблюдать, если вы не являетесь конечным пользователем.; >