首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让StackPanel的子级向下填充最大空间?

如何让StackPanel的子级向下填充最大空间?
EN

Stack Overflow用户
提问于 2009-02-20 10:47:24
回答 4查看 390.8K关注 0票数 393

我只是想在左边流动的文本,并在右边的帮助框。

帮助框应该一直延伸到底部。

如果你去掉下面的外部StackPanel,它会工作得很好。

但是由于布局的原因(我动态地插入UserControls ),我需要包装StackPanel

如何让GroupBox向下扩展到StackPanel的底部,如您所见,我已经尝试过了:

  • VerticalAlignment="Stretch"
  • VerticalContentAlignment="Stretch"
  • Height="Auto"

XAML:

代码语言:javascript
复制
<Window x:Class="TestDynamic033.Test3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test3" Height="300" Width="600">
    <StackPanel 
        VerticalAlignment="Stretch" 
        Height="Auto">

        <DockPanel 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch" 
            Height="Auto" 
            Margin="10">

            <GroupBox 
                DockPanel.Dock="Right" 
                Header="Help" 
                Width="100" 
                Background="Beige" 
                VerticalAlignment="Stretch" 
                VerticalContentAlignment="Stretch" 
                Height="Auto">
                <TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap" />
            </GroupBox>

            <StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
                <TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
            </StackPanel>

        </DockPanel>
    </StackPanel>
</Window>

答案:

谢谢马克,用DockPanel而不是StackPanel把事情搞清楚了。总的来说,我发现自己现在越来越多地使用DockPanel进行WPF布局,下面是修复后的XAML:

代码语言:javascript
复制
<Window x:Class="TestDynamic033.Test3"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Test3" Height="300" Width="600" MinWidth="500" MinHeight="200">
    <DockPanel 
        VerticalAlignment="Stretch" 
        Height="Auto">

        <DockPanel 
            HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch" 
            Height="Auto" 
            MinWidth="400"
            Margin="10">

            <GroupBox 
                DockPanel.Dock="Right" 
                Header="Help" 
                Width="100" 
                VerticalAlignment="Stretch" 
                VerticalContentAlignment="Stretch" 
                Height="Auto">
                <Border CornerRadius="3" Background="Beige">
                    <TextBlock Text="This is the help that is available on the news screen." TextWrapping="Wrap" 

                Padding="5"/>
                </Border>
            </GroupBox>

            <StackPanel DockPanel.Dock="Left" Margin="10" Width="Auto" HorizontalAlignment="Stretch">
                <TextBlock Text="Here is the news that should wrap around." TextWrapping="Wrap"/>
            </StackPanel>

        </DockPanel>
    </DockPanel>
</Window>
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-02-20 11:25:08

这听起来像是您想要一个StackPanel,其中最后一个元素会用完所有剩余的空间。但是为什么不使用DockPanel呢?用DockPanel.Dock="Top"修饰DockPanel中的其他元素,然后帮助控件就可以填充剩余的空间。

XAML:

代码语言:javascript
复制
<DockPanel Width="200" Height="200" Background="PowderBlue">
    <TextBlock DockPanel.Dock="Top">Something</TextBlock>
    <TextBlock DockPanel.Dock="Top">Something else</TextBlock>
    <DockPanel
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        Height="Auto" 
        Margin="10">

      <GroupBox 
        DockPanel.Dock="Right" 
        Header="Help" 
        Width="100" 
        Background="Beige" 
        VerticalAlignment="Stretch" 
        VerticalContentAlignment="Stretch" 
        Height="Auto">
        <TextBlock Text="This is the help that is available on the news screen." 
                   TextWrapping="Wrap" />
     </GroupBox>

      <StackPanel DockPanel.Dock="Left" Margin="10" 
           Width="Auto" HorizontalAlignment="Stretch">
          <TextBlock Text="Here is the news that should wrap around." 
                     TextWrapping="Wrap"/>
      </StackPanel>
    </DockPanel>
</DockPanel>

如果您所在的平台没有可用的DockPanel (例如WindowsStore),则可以使用网格创建相同的效果。下面是使用网格实现的上面的例子:

代码语言:javascript
复制
<Grid Width="200" Height="200" Background="PowderBlue">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    <StackPanel Grid.Row="0">
        <TextBlock>Something</TextBlock>
        <TextBlock>Something else</TextBlock>
    </StackPanel>
    <Grid Height="Auto" Grid.Row="1" Margin="10">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="*"/>
            <ColumnDefinition Width="100"/>
        </Grid.ColumnDefinitions>
        <GroupBox
            Width="100"
            Height="Auto"
            Grid.Column="1"
            Background="Beige"
            Header="Help">
            <TextBlock Text="This is the help that is available on the news screen." 
              TextWrapping="Wrap"/>
        </GroupBox>
        <StackPanel Width="Auto" Margin="10" DockPanel.Dock="Left">
            <TextBlock Text="Here is the news that should wrap around." 
              TextWrapping="Wrap"/>
        </StackPanel>
    </Grid>
</Grid>
票数 375
EN

Stack Overflow用户

发布于 2009-02-20 11:44:53

之所以会发生这种情况,是因为堆叠面板会测量每个具有正无穷大的子元素,并将其作为堆叠元素所沿着的轴的约束。子控件必须返回它们想要的大小(正无穷大不是MeasureOverride在任一轴上的有效返回),因此它们返回所有东西都能容纳的最小大小。他们没有办法知道他们真正需要填充多少空间。

如果你的视图不需要滚动功能,并且上面的答案不适合你的需要,我建议实现你自己的面板。您可能可以直接从StackPanel派生,然后您需要做的就是更改ArrangeOverride方法,以便它在其子元素之间划分剩余空间(为每个子元素提供相同数量的额外空间)。如果给元素的空间比它们想要的多,那么它们应该呈现得很好,但是如果你给它们的空间太少,你就会开始看到小问题。

如果你想要滚动整个东西,那么我担心事情会变得相当困难,因为ScrollViewer给了你无限的工作空间,这将使你处于与最初的子元素相同的位置。在这种情况下,你可能想要在你的新面板上创建一个新的属性,让你指定视区的大小,你应该能够将它绑定到ScrollViewer的大小。理想情况下,您应该实现IScrollInfo,但如果您要正确地实现所有这些,就会变得复杂起来。

票数 114
EN

Stack Overflow用户

发布于 2009-02-20 17:30:41

另一种方法是使用具有一列和n行的网格。将所有行的高度设置为Auto,并将最底部的行高设置为1*

我更喜欢这种方法,因为我发现网格比DockPanels、StackPanels和WrapPanels具有更好的布局性能。但是,除非您在ItemTemplate中使用它们(对大量项目执行布局),否则您可能永远不会注意到。

票数 70
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/569095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档