39

我有一个带有两个元素的垂直 StackPanel:一个按钮和一个列表框。如何让 ListBox 拉伸到剩余的页面高度?

<StackPanel Height="Auto" Width="Auto">
    <Button Height="30" Width="100" Content="Get Content" x:Name="GetContent"/>
    <ListBox Height="Auto" Width="Auto" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"/>
</StackPanel>

请注意,我使用 Grid 容器使其工作:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Button Width="100" Height="30" Content="Get Content" Click="OnGetContent" Grid.Row="0" Grid.Column="0"/>
    <data:DataGrid x:Name="MyContent" Margin="0,5" Grid.Row="1" Grid.Column="0"/>
</Grid>
4

4 回答 4

40

好吧,您已经找到了解决方案;)默认情况下,StackPanels 不会填充任何剩余空间,因为它们的大小始终等于其子元素的组合所需大小。Grid 是一个很好的方法,因为它会在浏览器大小发生变化时动态调整大小。马克使用 DockPanel 的回答也很好。唯一的其他方法是在父控件的大小更改时手动调整元素的大小。一般来说,坚持使用 Grids 进行外部布局,并用 StackPanels 和其他控件填充它们,您应该进行设置。

于 2009-07-07T12:19:14.937 回答
20

您可以使用DockPanel. 将第一项设置为停靠顶部,将第二项设置为停靠填充,或使用以下LastChildFill属性:

<toolkit:DockPanel LastChildFill="True"
 xmlns:toolkit="http://schemas.microsoft.com/winfx/2006/xaml/presentation/toolkit">    
    <Button DockPanel.Dock="Top" Height="30" Width="100" 
     Content="Get Content" x:Name="GetContent"/>
    <ListBox Background="Azure" />
</toolkit:DockPanel>
于 2009-07-07T10:38:20.397 回答
15

我同意 James 的观察,即“默认情况下,StackPanel 不会填充任何剩余空间,因为它们的大小始终等于其子元素的组合所需大小。” 这正是发生的事情,但这不是预期的结果。

我可以理解为什么这条指令会将内容压缩到最小的必要空间中。

<StackPanel Height="Auto" Width="Auto">

但是... StackPanel 接受一个 Horizo​​ntalAlignment 参数 - 如果选择该参数,应该会导致堆栈面板填充其父容器的内容。这正是设置 Orientation="Vertical" 时发生的情况。请注意,在这种情况下,StackPanel 将确定有多少水平空间可用并将其分配给子控件。

<StackPanel Height="30" Orientation="Vertical" HorizontalAlignment="Stretch" > 
   <TextBox /> <!--TextBox fills entire space-->
</StackPanel>

只有当 Orientation="Horizo​​ntal" 时,Horizo​​ntal child sizing 才会失效。

<StackPanel Height="30" Orientation="Horizontal" HorizontalAlignment="Stretch" > 
   <TextBox /> <!--TextBox fills smallest space available-->
</StackPanel>
于 2010-04-09T00:16:41.243 回答
2

使用 UniformGrid Columns="2" 而不是 StackPanel。

于 2012-01-18T13:34:55.950 回答