我需要能够填充 astackpanel
但buttons
按钮必须首先出现在堆栈面板的底部并向上填充。这些按钮是动态创建的,并且数量不详,因此视觉黑客无法正常工作。我尝试过垂直对齐但无济于事。
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 代替。
只需在 DockPanel 上将 LastChildFill 设置为 false。
然后在添加到 DockPanel 之前将附加的 Dock 属性设置到要添加到底部的每个按钮。
例子 :
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)并使其底部对齐。然后,当您填充按钮时,将每个新按钮放在第一个位置。
我发现使用 Column=1 的 UniformGrid 可以提供整洁的填充堆栈,或者设置 Rows=1 可以提供整洁的水平填充堆栈。从索引 0 添加将自下而上进行。
喜欢 Nir 的转换解决方案。我想知道是否可以使用转换来完成。
但是有一点需要注意:不要在基于 ScrollView 的控件(例如 ListBox)上使用转换技巧,因为滚动条操作将与内容相反。只要您不是最终用户,就很有趣。;>