如何设置数据网格列以填充数据网格集以填充和布局自动调整大小的网格?

Posted

技术标签:

【中文标题】如何设置数据网格列以填充数据网格集以填充和布局自动调整大小的网格?【英文标题】:How do I set a datagrid column to fill within a datagrid set to fill and layout grid that is autosized? 【发布时间】:2015-01-11 12:18:10 【问题描述】:

我遇到了 WPF 数据网格中的列大小问题。

下面我有一个包含 2 个相等数据网格的示例。两者都有 1 个固定列(代码)和 1 个用 * 大小(描述)设置填充的列。它们都包含在布局网格中。

第一个数据网格包含在布局网格中固定大小的列 (WorkingGrid) 中。它工作正常。固定的“代码”列是正确的宽度,而 * 大小的“描述”列填充了剩余空间。

第二个数据网格包含在布局网格中自动调整大小的列 (BrokenGrid) 中。它具有与其他数据网格完全相同的设置,但忽略指定的所有数据网格列宽。它们似乎变成了默认的最小尺寸,我认为是 20。奇怪的是,实际的数据网格本身会扩展以填充剩余空间,位于 BrokenGrid 列中的所有其他控件和布局网格也是如此。 Datagrid 列仍然被压缩到 20 像素,包括指定宽度为 100 的固定“代码”列。

这是一个例子,大大简化了:

<Grid Attached:ReadOnlyOptions.IsReadOnly="Binding IsReadOnly">
    <Grid.ColumnDefinitions>
        <ColumnDefinition x:Name="WorkingGrid" Width="500"/>
        <ColumnDefinition x:Name="BrokenGrid" Width="Auto"/>
    </Grid.ColumnDefinitions>

    <DataGrid Grid.Column="0" VerticalAlignment="Top" ItemsSource="Binding AllResults">
        <DataGrid.Columns>
            <DataGridTextColumn Header="code" Width="100" Binding="Binding Path=Code"/>
            <DataGridTextColumn Header="description" Width="*" Binding="Binding Path=Description"/>
        </DataGrid.Columns>
    </DataGrid>

    <DataGrid Grid.Column="1" VerticalAlignment="Top" ItemsSource="Binding AllResults">
        <DataGrid.Columns>
            <DataGridTextColumn Header="code" Width="100" Binding="Binding Path=Code"/>
            <DataGridTextColumn Header="description" Width="*" Binding="Binding Path=Description"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

在现实世界的示例中,网格中实际上存在很大的网格层次结构,但如果任何这些网格中的任何列(直接或间接包含数据网格)在层次结构链的整个过程中的宽度为自动,它只破坏数据网格列。如果我修复或 * 这些列的宽度,则数据网格列的行为正确。

我需要它来工作,这样我才能在一个网格中包含一组控件/数据网格,这些控件/数据网格都会自动扩展到最宽内容的宽度,但是该集中的所有数据网格都有一个填充该数据网格宽度的列(减去任何固定宽度的列都在那里)。

【问题讨论】:

【参考方案1】:

如果可能的话,为 BrokenGrid 使用 Width="*"。

第二个解决方案是为第二个 DataGrid 设置固定宽度


“*”和“自动”的区别:

“*” - 占据所有左边的位置(无论列中需要多少元素) “自动”- 占据所有左边或更少的位置(与列中的元素一样多)

在你的情况下,DataGrid 告诉 BrokenGrid,它需要 42.0px(我想我可能是一些 DataGrid 错误,它应该至少需要 100px)

【讨论】:

谢谢托马斯。不幸的是,将 BrokenGrid 的宽度设置为 * 会导致列折叠。然而,网格本身会根据预期的所有其他内容正确调整大小。如果我固定网格的宽度,它将不再适合内容的宽度。这是我目前采用的方法。

以上是关于如何设置数据网格列以填充数据网格集以填充和布局自动调整大小的网格?的主要内容,如果未能解决你的问题,请参考以下文章

先填充网格布局管理器列,然后填充行

如何使wpf数据网格填充所有可用空间并使用窗口调整大小?

如何使用 vb.net 2003 在 asp.net 1.1 中手动填充数据网格?

如何在行单击时用数据填充指定的详细信息网格

Sheridan SSDB网格为整列设定值

wpf删除数据网格左填充