自动调整大小以适合所有内容
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? 和其他类似问题不同,因为它们仍然会触发可见内容的当前大小调整行为,并且不会解决所有内容。
问题是 ListView
的 ItemsPanel
默认启用了虚拟化。在这种模式下,只有可见的内容会被渲染,然后会触发自动调整大小的列。因此,如果您的 ListView
中没有很多项目,您可以通过附带的 属性 VirtualizingStackPanel.IsVirtualizing
关闭虚拟化模式,然后它将正常工作:
<ListView VirtualizingStackPanel.IsVirtualizing="false">
<!-- ... -->
</ListView>
如果您不想关闭虚拟化,那么我认为没有什么简单的方法可以利用 Width="Auto"
。您可能必须自己手动实现该功能。从技术上讲,我们需要了解最大宽度才能相应地更新列的宽度。每次我们需要更新列的宽度时,我们都可以进行一些 for 循环,但这很昂贵。我们还可以设法在每次单元格内容更改时存储最大宽度(这是更好的方法)。无论如何,手动操作很痛苦。
在 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? 和其他类似问题不同,因为它们仍然会触发可见内容的当前大小调整行为,并且不会解决所有内容。
问题是 ListView
的 ItemsPanel
默认启用了虚拟化。在这种模式下,只有可见的内容会被渲染,然后会触发自动调整大小的列。因此,如果您的 ListView
中没有很多项目,您可以通过附带的 属性 VirtualizingStackPanel.IsVirtualizing
关闭虚拟化模式,然后它将正常工作:
<ListView VirtualizingStackPanel.IsVirtualizing="false">
<!-- ... -->
</ListView>
如果您不想关闭虚拟化,那么我认为没有什么简单的方法可以利用 Width="Auto"
。您可能必须自己手动实现该功能。从技术上讲,我们需要了解最大宽度才能相应地更新列的宽度。每次我们需要更新列的宽度时,我们都可以进行一些 for 循环,但这很昂贵。我们还可以设法在每次单元格内容更改时存储最大宽度(这是更好的方法)。无论如何,手动操作很痛苦。