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

标签 wpf xaml grid multiple-columns

我有一个包含 3 列的网格:第一列的 Width 设置为“*”,我被引导相信它会填满其他列留下的任何剩余空间。第二个的宽度为 8,第三个的 Width 设置为“Auto”,因此其大小根据其内容而变化。

在我的第二列中,我有一个 GridSplitter ,这样在拖动时我可以更改第一列和第三列的宽度。这很好用,问题是我的第三列中有一个网格,当切换时,它的可见性设置为折叠。折叠时,我需要第一列来填充所有剩余空间。我尝试了很多方法:

  • 设置 HorizontalAlignment在第一列到 Stretch
  • 绑定(bind)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>
    

    最佳答案

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

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

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

    然后,为 MetadataGrid 可见性更改时添加一个事件处理程序,并调用此代码将 Column1 重置为 * 宽度以填充其余部分:
    Column1.Width = new GridLength(1, GridUnitType.Star);
    

    您还可以尝试使用样式触发器在 XAML 中执行某些操作,以根据 MetadataGrid 的可见性状态将 Column1 宽度重置为 *。我的案例对于自定义大小和不同的条件和扩展器要复杂得多,所以我使用了代码隐藏,所以我不确定 xaml 触发器是否适合你。希望这会有所帮助。

    关于wpf - 当其他列的内容折叠时,网格列不填充剩余空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31457590/

    相关文章:

    c# - WPF:如何从不同程序集中的窗口开始

    sorting - Tapestry 网格默认排序

    java - 如何计算我点击嵌套 for 循环网格内部的哪个 "cell"

    c#打印xaml创建的页面

    wpf - 先学 Silverlight 还是 WPF?

    c# - 如何像图像一样在 C# WPF 窗口中添加 svg/xaml 文件?

    extjs 网格面板不显示滚动条

    c# - 如何按照 MVVM 模式绑定(bind)整个数据网格以查看 MVVM

    c# - 引用类型 DependencyProperty 的 WPF 样式

    wpf - Textblock样式覆盖的Button和Menuitem前景色