Ali*_*eem 5 wpf grid xaml multiple-columns
我有一个包含3列的网格:第一个网格的Width设置为“ *”,我被认为会使其填满其他列剩余的空间。第二个的宽度为8,第三个的宽度设置为“自动”,因此其大小根据其内容而变化。
在第二列中,我有一个GridSplitter,以便在拖动时可以更改第一列和第三列的宽度。这样做很好,问题是我在第三列中有一个网格,当切换该网格时,其可见性将设置为折叠。折叠时,我需要第一列来填充所有剩余空间。我尝试了许多方法:
HorizontalAlignment在第一列上设置为StretchGrid.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>
Run Code Online (Sandbox Code Playgroud)
我也刚刚遇到了这个。在我的应用程序中,似乎 GridSplitter 实际上也将宽度值更改为绝对值而不是 * ,所以我猜测这就是行为。
我最终使用代码隐藏来解决它。首先,命名第 1 列:
<ColumnDefinition Width="*" x:Name="Column1"/>
Run Code Online (Sandbox Code Playgroud)
然后,在 MetadataGrid 可见性发生变化时添加一个事件处理程序,并调用此代码将 Column1 重置为 * 宽度以填充其余部分:
Column1.Width = new GridLength(1, GridUnitType.Star);
Run Code Online (Sandbox Code Playgroud)
您还可以尝试在 XAML 中使用样式触发器执行某些操作,以根据 MetadataGrid 的可见性状态将 Column1 宽度重置为 *。我的情况要复杂得多,有自定义尺寸、不同的条件和扩展器,所以我使用了代码隐藏,所以我不确定 xaml 触发器是否适合您。希望这会有所帮助。
| 归档时间: |
|
| 查看次数: |
1026 次 |
| 最近记录: |