首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么StackPanel不垂直拉伸它的孩子?

问为什么StackPanel不垂直拉伸它的孩子?
EN

Stack Overflow用户
提问于 2014-01-30 23:01:45
回答 2查看 2.5K关注 0票数 5

(新加入WPF)我正在查看WPF示例:

代码语言:javascript
复制
<Window x:Class="Attempt_XAML.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

    <StackPanel>
        <Label HorizontalAlignment="Center">A Button Stack</Label>
        <Button HorizontalAlignment="Left">Button 1</Button>
        <Button HorizontalAlignment="Right">Button 2</Button>
        <Button Background="#FFA29494">Button 3</Button>
        <Button>Button 4</Button>
    </StackPanel>
</Window>

在MS中的评论指出:

对于包含在一个HorizontalAlignment中的内容的VerticalAlignment和StackPanel,默认值都是拉伸的。

然而,结果看起来与我所期望的不一样。Button和Label不是垂直展开的,而是水平展开的(也就是说,它们没有在两个方向上填满Window的整个空间)为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-01-31 00:03:36

按钮和标签不是垂直展开的,而是水平展开的(也就是说,它们没有在两个方向填满整个窗口空间)为什么?

要理解原因,您至少需要对面板有一个基本的理解。任何面板(如StackPanel )都使用度量值-安排周期来决定其子元素的布局:

  • 在“度量”周期中,它为每个孩子指定一个大小。
  • 在“排列”周期中,它将每个孩子放置在自己的视图中。

StackPanel的主要特征是它有无限的空间--如果它的方向是Horizontal,则是无限的水平空间,如果是Vertical,则是无限的垂直空间。换句话说,它实际上并不注意它可以使用的大小(在它的方向上),而是声称有一个无限的空间。因此,回到您的例子中,即使子类的VerticalAlignment可能是Stretch,它们实际上也不能伸展到无限大的范围。

如果您需要一个扩展其子面板来填充可用空间的面板,那么Grid就是一个很好的例子(默认情况下,网格将为每个子节点分配相等的总高度份额--或者您可以使用星型尺寸来调整比例)。如果需要特殊的布局行为,还可以考虑创建自己的自定义面板。

编辑

澄清“无限空间”:我的意思是,StackPanel告诉它的子空间有无限的可用空间。如果你是一个按钮,标签等,并且有无限的可用空间,你会做什么?您可能只是占用了所需的最小空间,即使您的VerticalAlignment是“拉伸”的,对吗?这就是发生的事。与网格相反,网格告诉子控件它们有x(有限)空间--在这种情况下,按钮、标签等将填充所有的空间(如果它们的VerticalAlignment是“拉伸”的)。

为了说明上面的内容,以这个自定义控件为例:

代码语言:javascript
复制
public class TestControl : ContentControl
{
    public string Description { get; set; }

    protected override Size MeasureOverride(Size availableSize)
    {
        System.Diagnostics.Debug.WriteLine("Size available for '" + Description + "': " + availableSize.Height);
        return base.MeasureOverride(availableSize);
    }
}

这实际上什么也不做,只是报告分配了多少空间给它。现在,将测试控件放在Grid和StackPanel中,并进行比较:

代码语言:javascript
复制
<Grid Height="50">
    <Grid.RowDefinition />
    <Grid.RowDefinition />

    <local:TestControl Description="in Grid" />

    <StackPanel Grid.Row="1" Height="10">
        <local:TestControl Description="in StackPanel" />
    </StackPanel>
</Grid>

您将看到Grid将其CustomPanel (上面的第一个)的高度分配为25 (其高度的一半)。然而,StackPanel为它的CustomPanel指定了无限的高度。

票数 11
EN

Stack Overflow用户

发布于 2014-01-30 23:40:28

尽管对于包含在一个HorizontalAlignment中的Content和VerticalAlignment of Content来说,默认值都是可扩展的。但拉伸方向受Orientation属性控制。

如果Orientation设置为Vertical,那么堆栈中没有定义宽度值的所有项都将被拉伸。

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

https://stackoverflow.com/questions/21469270

复制
相关文章

相似问题

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