在 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 循环,但这很昂贵。我们还可以在每次单元格内容更改时存储最大宽度(这是更好的方法)。无论如何,手动操作是一件痛苦的事情。
关于c# - 自动调整大小以适合所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851781/