我需要能够填充一个 stackpanel
,其中包含一些 buttons
,但这些按钮 必须先出现在 stackpanel 的底部,然后向上填充。这些按钮是动态创建的,数量不确定,因此视觉 hackery 就行不通。我已经尝试过垂直对齐,但没有成功。
我需要能够填充一个 stackpanel
,其中包含一些 buttons
,但这些按钮 必须先出现在 stackpanel 的底部,然后向上填充。这些按钮是动态创建的,数量不确定,因此视觉 hackery 就行不通。我已经尝试过垂直对齐,但没有成功。
像这样:
<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即可。
然后在将按钮添加到Bottom之前,将附加的Dock属性设置为DockPanel上的每个按钮。
示例:
var button = new Button();
DockPanel.SetDock(button, Dock.Bottom);
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开始添加将从下往上工作。
UniformGrid
的一个注意事项是,添加的每个元素都将具有相同的水平/垂直大小,因此,如果元素本身具有不同的大小,则它们在堆叠时不会像StackPanel
一样接触。 - devios1我喜欢Nir的变换解决方案。我在想是否可以使用变换来实现。
不过有一个注意点,不要在基于ScrollView的控件(例如ListBox)上使用变换技巧,因为滚动条操作会与内容反转。这看起来很有趣,只要你不是最终用户就好。
HorizontalAlignment="Right"
可以从右到左填充。 - ChriPf