StackPanel中的网格:为什么auto和*表现得很奇怪?

时间:2011-11-18 20:32:24

标签: wpf grid width stackpanel

我的google和stackoverflow搜索功能让我失望,所以我向社区提出了这个问题。

(这是使用VS2010和.NET 4.0在空白的默认WPF解决方案中生成的)

考虑以下XAML:

<StackPanel Orientation="Horizontal">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>

        <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
                    Background="Red" Width="200"/>
        <Border Name="aborder2" Background="Green"/>

    </Grid>
</StackPanel>

你会预测“aborder2”的宽度是多少?

如果您猜到“20像素”,那就错了。正确的答案是110像素。

考虑一下这个XAML:

    <StackPanel Orientation="Horizontal">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20"/>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>

        <Border Name="aborder" Grid.Column="0" Grid.ColumnSpan="2" 
                    Background="Red" Width="200"/>
        <Border Name="aborder2" Background="Green"/>

    </Grid>
</StackPanel>

你会预测“aborder2”的宽度是什么?

如果你猜到20像素或110像素,你就错了。正确的答案是200像素。

我无法理解这一点,这让我疯了。似乎答案应该是显而易见的;显然,自动填充网格列和堆栈面板之间存在一些相互作用,导致网格发生故障。但它似乎并没有使意义 - 无论规则如何管理这种行为似乎是任意的。为何110像素?为什么不是109像素或100像素?我会理解,如果自动调整大小的列无法完全展开或者某些东西,但是让固定宽度列随机忽略它的宽度,这给我留下了开发人员的烧焦外壳。

非常感谢任何帮助或指导灯!

2 个答案:

答案 0 :(得分:3)

我不知道为什么第一个例子没有正确呈现

第二个是因为Auto表示“与内容大小相同”,但是在Column2中没有任何内容,因此Column2将以0px呈现。您在Column1中有一些跨越2个单元格的东西,但由于Column2渲染为0 px,这意味着Column1被拉伸到200像素。默认情况下,Grid会扩展子节点以填充Cell中的所有可用空间,因此这会使aborder2拉伸到200px而不是20。

我认为第一个例子可能是类似的情况,其中Column2呈现为0px因为它没有内容,但我不确定为什么它将aborder2设置为宽度为110. 110似乎来自(GridWidth / TotalColumns) + (1stColumnWidth / TotalColumns * NumberOfStarColumns),所以我认为这是一个错误。

作为旁注,您可以设置Column1的MaxWidth="20"以强制Column1始终呈现为20px

答案 1 :(得分:1)

没有答案,但似乎也发生在Silverlight中。我假设在安排和测量通行证中存在一些错误。如果您在其中放置自定义控件而不是边框​​并覆盖度量并安排方法,您可能会更好地了解正在发生的事情。

试图解决110来自何处的谜团,我猜(200 - 20)/ 2 + 20

编辑:我尝试了其他一些公式而且没有坚持,看起来更像是:

(200 + 20)/ 2