【发布时间】:2015-10-06 02:21:57
【问题描述】:
我有一个包含 3 列的网格:第一列的 Width 设置为“*”,我被引导相信它会填满其他列留下的任何剩余空间。第二个的宽度为 8,第三个的 Width 设置为“Auto”,因此其大小会根据其内容而变化。
在我的第二列中,我有一个GridSplitter,因此当拖动时我可以更改第一列和第三列的宽度。这很好用,问题是我的第三列中有一个网格,当切换时,它的可见性设置为折叠。折叠时,我需要第一列来填充所有剩余空间。我尝试了很多方法:
- 将第一列上的
HorizontalAlignment设置为Stretch - 将第一列的
Grid.Rowspan绑定到第三列的可见性,这样当隐藏时,Rowspan 将变为 3,并且由于其宽度使用“*”,因此理论上应该使用所有可用的所有 3 列中的空间。
奇怪的是,如果我不使用GridSplitter 调整列的大小,那么第一列将正确填充所有剩余空间。然而在调整大小之后,第一列不会让步。就好像,当拖动 GridSplitter 调整列大小时,WPF 将两列的宽度更改为绝对值,而不是它们的星号和自动值,使其在调整大小后不会填充空间。
XAML 代码(压缩)按要求:
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<Grid x:Name="AssetListViewGrid" Grid.Column="0" Grid.RowSpan="{Binding Visibility, ElementName=AssetViewMetadataSplitter, Converter={StaticResource SplitterVisibilityToRowSpanConverter}}" Margin="0 4 0 4">
<!-- irrelevant code -->
</Grid>
<GridSplitter x:Name="AssetViewMetadataSplitter" Grid.Column="1" Opacity="0.8" HorizontalAlignment="Center" Width="6" Margin="3 5 1 5" ToolTip="Grab to resize" Visibility="{Binding IsChecked, ElementName=GridHeaderVisibilityToggleButton, Converter={StaticResource VisConverter}}"/>
<Grid x:Name="MetadataGrid" Margin="4 2 4 2" Grid.Column="2" DataContext="{Binding MetadataViewModel}" Visibility="{Binding IsChecked, ElementName=GridHeaderVisibilityToggleButton, Converter={StaticResource VisConverter}}">
<!-- irrelevant code -->
</Grid>
【问题讨论】:
-
至少显示你的 xaml 代码
-
使用 Snoop 并对其进行调查以查看值是否正在变为常量
-
@TheodosiusVonRichthofen 代码太多,我无法简单地转入问题,所有相关的属性、控件和标签都在原帖中提到。我将在原始帖子中添加一个非常简洁的版本,但您不会获得比文本中提供的更多信息。
-
@TheodosiusVonRichthofen 忘了包括我用 Snoop 调查的内容,宽度显示为 NaN,这应该意味着宽度由控件的子控件的大小决定,所以它应该可以工作。
标签: wpf xaml grid multiple-columns