2011-11-18 67 views
10

我的谷歌和stackoverflow搜索福已经失败了我,所以我向社区提出这个问题。StackPanel中的网格:为什么auto和*的行为很奇怪?

(这是使用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像素?我会理解,如果自动调整大小的列未能完全展开或者其他东西,但是让固定宽度的列随机忽略其宽度,则会让我失去开发人员的外壳。

任何帮助或指导灯将不胜感激!

+0

为什么不aborder2得到Grid.Column? – 0x4f3759df

+0

我没有想过要放入一个,因为它应该默认为第0列。我只是测试它,明确设置列似乎没有什么区别。 – pfw

+0

对你有一个答案,但我必须首先回家 –

回答

3

我不知道为什么在第一示例并不呈现正确

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

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

作为一个侧面说明,您可以设置列1的MaxWidth="20"迫使列1总是呈现为20像素

+1

那么,至少你得出的公式来确定110px,所以你赢得了upvote!我自己找不到任何关系。 – pfw

+0

在第一个示例中,第二列在90px处呈现,而不是0。第一列在110处呈现(110 + 90 = 200来容纳'aborder1',尽管我不知道它们为什么以这些尺寸渲染),而'aborder2'正在伸展以填充它。 –

+0

有趣的是,设置MaxWidth可以防止调整大小。 –

1

没有答案给你,但它似乎也发生在Silverlight中。我假设在安排和测量过程中存在一些错误。如果您将自定义控件放在那里而不是边框​​,并且覆盖度量和排列方法,您可能会更好地了解发生了什么。

要设法解决的,其中110从何而来,我猜谜(200 - 20)/ 2 + 20

编辑:我尝试了一些其他公式,并没有抱起来,看起来更像:

(200 + 20)/ 2