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

Posted

技术标签:

【中文标题】wpf - 当其他列的内容折叠时,网格列不填充剩余空间【英文标题】:wpf - Grid column not filling remaining space when other column's contents are collapsed 【发布时间】: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,这应该意味着宽度由控件的子控件的大小决定,所以它应该可以工作。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

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

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

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

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

【讨论】:

感谢您的想法,但我尝试了这种方法,但它对我不起作用:(

以上是关于wpf - 当其他列的内容折叠时,网格列不填充剩余空间的主要内容,如果未能解决你的问题,请参考以下文章

WPF扩展器单击事件上的展开/折叠网格列

当窗口垂直调整为更小的尺寸时,避免 WPF 状态栏完全折叠

如何使文本框扩展以填充网格单元的剩余空间?

WPF 网格 — 按特定顺序调整列的大小

WPF数据网格粘贴

WPF - 折叠网格单元