自动调整大小以适合所有内容

Autosize to fit All Content

在 WPF 中,我有以下内容:

<ListView.View>
    <GridView>
        <GridViewColumn
            Width="Auto"
            DisplayMemberBinding="{Binding SomeProperty, Mode=OneWay}"
            Header="Type"/>

问题在于,这只会将列的大小自动调整为 可见 内容。这与双击页眉分隔符时的行为相同。

我希望它根据 所有 内容调整列的大小。作为对比,将 Winforms DataGridView 等同于当前的自动调整大小行为和等同于所需的行为:

this.dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.DisplayedCells; // Current behavior
this.dataGridView1.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;       // Desired behavior

对于 WPF ListView 这可能吗?

这个问题与 How to autosize and right-align GridViewColumn data in WPF? 和其他类似问题不同,因为它们仍然会触发可见内容的当前大小调整行为,并且不会解决所有内容。

问题是 ListViewItemsPanel 默认启用了虚拟化。在这种模式下,只有可见的内容会被渲染,然后会触发自动调整大小的列。因此,如果您的 ListView 中没有很多项目,您可以通过附带的 属性 VirtualizingStackPanel.IsVirtualizing 关闭虚拟化模式,然后它将正常工作:

<ListView VirtualizingStackPanel.IsVirtualizing="false">
       <!-- ... -->
</ListView>

如果您不想关闭虚拟化,那么我认为没有什么简单的方法可以利用 Width="Auto"。您可能必须自己手动实现该功能。从技术上讲,我们需要了解最大宽度才能相应地更新列的宽度。每次我们需要更新列的宽度时,我们都可以进行一些 for 循环,但这很昂贵。我们还可以设法在每次单元格内容更改时存储最大宽度(这是更好的方法)。无论如何,手动操作很痛苦。