我需要能够使用stackpanel
填充buttons
但按钮必须首先显示在堆栈面板的底部并向上填充。这些按钮是动态创建的,并且它们的数量未知,因此视觉上的hackery将无法正常工作。我尝试过垂直对齐,但无济于事。
答案 0 :(得分:44)
像这样:
<StackPanel VerticalAlignment="Bottom">
...
</StackPanel>
要向上填充按钮,您必须将按钮插入位置0,而不是添加它们。
答案 1 :(得分:15)
或者您可以将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>
答案 2 :(得分:8)
另一种方法是使用DockPanel。
只需在DockPanel上将LastChildFill设置为false。
然后在添加到DockPanel之前,将附加的Dock属性设置为要添加到Bottom的每个按钮。
示例:
var button = new Button();
DockPanel.SetDock(button, Dock.Bottom);
答案 3 :(得分:3)
解决问题的最佳方法是实现从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位置而不是添加它们。
答案 4 :(得分:2)
尝试将StackPanel放在另一个容器(不是StackPanel;可能是DockPanel)中并将其底部对齐。然后,当您填充按钮时,将每个新按钮放入第一个位置。
答案 5 :(得分:1)
我发现使用带有Column = 1的UniformGrid会给出一个整齐的填充堆栈,或者设置Rows = 1会给出一个整齐的填充堆栈。从索引0添加将自下而上。
答案 6 :(得分:0)
喜欢Nir的变换解决方案。我想知道是否可以使用变换来完成。
但有一点需要注意:不要在基于ScrollView的控件(如ListBox)上使用转换技巧,因为滚动条操作将从内容中反转。只要你不是最终用户,热闹观看。 ;&GT;