我的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像素?我会理解,如果自动调整大小的列无法完全展开或者某些东西,但是让固定宽度列随机忽略它的宽度,这给我留下了开发人员的烧焦外壳。
非常感谢任何帮助或指导灯!
答案 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