wpf - 当其他列的内容折叠时,网格列不填充剩余空间

时间:2015-07-16 14:48:57

标签: wpf xaml grid multiple-columns

我有一个包含3列的网格:第一列的宽度设置为“*”,我认为这会使其填满其他列留下的剩余空间。第二个宽度为8,第三个宽度设置为“自动”,因此其大小根据其内容而变化。

在我的第二列中,我有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>

2 个答案:

答案 0 :(得分:0)

我也遇到了这个问题。在我的应用程序中,似乎GridSplitter实际上是将宽度值更改为绝对值而不是*也,所以我猜这就是行为。

我最终使用代码隐藏来解决它。首先,命名第1列:

<ColumnDefinition Width="*" x:Name="Column1"/>

然后,为MetadataGrid可见性更改时添加事件处理程序,&amp;调用此代码将Column1重置为*宽度以填充其余部分:

Column1.Width = new GridLength(1, GridUnitType.Star);

您可能还尝试使用样式触发器在XAML中执行某些操作,以根据MetadataGrid的可见性状态将Column1宽度重置为*。自定义尺寸&amp;和我的情况要复杂得多。各种条件和扩展器,所以我使用了代码隐藏,所以我不确定xaml触发器是否适用于yoU。希望这会有所帮助。

答案 1 :(得分:0)

这是一个有点旧的帖子,但如果其他人到达这里,我通过在其中添加空的 10000X1000 矩形来解决它

[<Grid Grid.Row="1" Grid.Column="1" Height="auto" HorizontalAlignment="Left" SizeChanged="Grid_SizeChanged"> <Image x:Name="currentImage" Height="auto" Width="auto" /> <Rectangle Width="10000" Height="10000" ></Rectangle> <Canvas x:Name="currentImageOverLay"/>]