我需要用stackpanel(框架)中的最后一个元素填充空白空间:

    <DockPanel>
        <StackPanel Orientation="Vertical">
            <Frame NavigationUIVisibility="Hidden" Height="100" x:Name="_menu" />
            <Frame NavigationUIVisibility="Hidden" x:Name="_mainFrame" />
        </StackPanel>
    </DockPanel>

_mainFrame-从_menu框架到底部填充空白空间

最佳答案

StackPanel不是用于允许元素“填充剩余空间”的布局容器。 StackPanel在其他布局容器中有特定的用途。它是垂直/水平地“堆叠”物品,并根据 child 的期望高度(比可用物品高)进行工作。这将使 children 得到他们想要的空间。

根据您的要求,您可以使用DockPanel/Grid。这两个控件都将允许父容器根据可用容器“限制”其子容器的尺寸。

在您的示例中,您已经有一个DockPanel。但是,您将StackPanel作为它的 child ,这是唯一没有太大意义的 child 。当要放入一个布局中的子项目超过1个时,您要尝试使用布局容器。在这种情况下,StackPanel是DockPanel的唯一子级。

为了使用DockPanel满足您的要求,您可以使用,

<DockPanel>
    <Frame NavigationUIVisibility="Hidden" Height="100" x:Name="_menu" DockPanel.Dock="Top" />
    <Frame NavigationUIVisibility="Hidden" x:Name="_mainFrame" />
</DockPanel>

默认情况下,DockPanel使用LastChildFill="True",因此声明中的第二项将被拉伸(stretch)以填充您需要的剩余可用空间。如果将此属性设置为false,则不会扩展它。

Grid做同样的事情:
<Grid>
  <Grid.RowDefinitions>
      <RowDefinition Height="Auto"/>
      <RowDefinition Height="*"/>
  </Grid.RowDefinitions>
  <Frame NavigationUIVisibility="Hidden" Height="100" x:Name="_menu" />
  <Frame NavigationUIVisibility="Hidden" x:Name="_mainFrame" Grid.Row="1" />
</Grid>

根据您的需求,我更喜欢DockPanelGrid方法是一个很好的了解并且可能在情况需要时使用的方法。

关于WPF StackPanel垂直框架全高,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18568567/

10-12 17:51