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