Dal*_*ard 8 wpf grid xaml columnspan
我在http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/5c7f5cdf-4351-4969-990f-29ce9ec84b87/上问了一个问题,但对一个奇怪的行为仍然缺乏一个很好的解释.
运行以下XAML显示第0列中的TextBlock宽度大于100,即使该列设置为宽度100.我认为奇怪的可能与它被包装在ScrollViewer中有关,但我不知道为什么.如果我在列上设置MaxWidth,它可以正常工作,但设置Width不会.
我感谢任何解释!这对我来说真是一个难题.
<Window x:Class="WpfApplication2.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Width="300">
<ScrollViewer HorizontalScrollBarVisibility="Auto" >
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock x:Name="textBlock" Text="{Binding ElementName=textBlock, Path=ActualWidth}" />
<TextBlock Text="column 1" Grid.Column="1" />
<TextBlock Grid.Row="1" Grid.ColumnSpan="3" Text="text here that is wider than the first two columns combined" />
</Grid>
</ScrollViewer>
</Window>
Run Code Online (Sandbox Code Playgroud)
这是一个非常好的问题,并测试了我们直觉的极限.它揭示了Grid的布局逻辑的实现细节.
100的宽度没有被尊重,因为:
通过在第一列上放置MaxWidth,您将约束Grid的布局逻辑,因此它将移动到第二列并对其进行拉伸.你会注意到在这种情况下它将超过100.
但是,只要网格的宽度设置为特定值或受其父级约束(例如,窗口中没有ScrollViewer),网格的宽度就会有一个特定的值,而第三列的宽度设置为即使它是空.现在Grid的自动调整大小代码已停用,它不再延伸任何列以尝试挤入该文本.您可以通过在Grid上放置特定宽度来查看此内容,即使它仍在ScrollViewer中.
编辑:现在我在原始线程中阅读了MSDN支持的答案,我认为这是正确的,这意味着这可能是附加属性的实现而不是网格本身的结果.然而,原则是一样的,希望我的解释足够清楚,以理解这里的微妙之处.