位于 StackPanel 底部

21

我的窗口中有一个网格(Grid),它占据了所有可用的垂直空间。在该网格内,有一个StackPanel,其中包含另一个StackPanel和一个Frame。我希望让该Frame粘着父StackPanel的底部。

<StackPanel>
    <StackPanel>
       //normal content
     </StackPanel>
     <Frame /> // should stick to the bottom
</StackPanel>

比如说,当用户改变窗口大小,Grid增加高度时,里面的Frame会贴在底部。

我尝试了各种方法,使用VerticalAlign="Stretch"或者一个DockPanel并给Frame赋值DockPanel.Dock="Bottom",但都没有成功。如果您能提供一两个提示,我将不胜感激。StackPanel可以替换成DockPanel。


1
请发布您的网格代码,并让我知道网格中其他行的高度应该是多少... - Saagar Elias Jacky
3个回答

39

StackPanel不是您要求的正确Panel,因为它们不提供与Grid相同的布局和调整大小功能。因此,只需用Grid替换它,将大部分空间给内部的StackPanel,然后Frame将粘在底部。

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />   
    </Grid.RowDefinitions>
    <StackPanel>
       //normal content
     </StackPanel>
     <Frame Grid.Row="1" />
</Grid>

你可以在MSDN的面板概述页面中了解更多关于不同WPF Panel的信息。

@peter:如果可能的话,请将此答案标记为解决方案 :) - Ben

15

看起来更像是使用 DockPanel 的一个用例。

<DockPanel>
    <StackPanel>
        <!--//normal content-->
    </StackPanel>
    <Frame DockPanel.Dock="Bottom"/> <!--// should stick to the bottom-->
</DockPanel>

1
在这种情况下,DockPanel 不是适当的 Panel,因为它们是重量级控件,并且它们提供的功能在这里并不需要。一个简单的 Grid 会更加高效。 - Sheridan
6
不知道具体用途情况,很难说DockPanel是否合适。我会让@Peter来做决定。 - Manish Basantani
1
@Sheridan,DockPanel 实际上提供的功能比 Grid 少,并且性能更好:https://dev59.com/5Gkw5IYBdhLWcg3wXpWb#9996707 - mark.monteiro
那个列表不是有序列表,并且没有考虑到像我们在这里讨论的这样简单的布局。Grid控件耗时的部分来自于复杂的ColumnDefinitionRowDefinition设置,以及其星号大小调整功能。一如既往,这取决于它将如何使用。 - Sheridan

-1
根据MSDN关于StackPanel的文档

StackPanel将子元素排列成一行,可以水平或垂直定位。

因此,在您的情况下,StackPanel不是正确的控件。如果您希望控件固定在特定位置,可以使用DockPanel并将控件放置在其中。

<DockPanel>
        <Frame DockPanel.Dock="Bottom"/>
</DockPanel>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接