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

时间:2015-09-29 18:59:00

标签: c# wpf listview gridviewcolumn

在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?和其他人不同,因为它们仍会触发当前可见内容的调整大小行为,并且不会解决所有内容。

1 个答案:

答案 0 :(得分:1)

问题是ListView默认启用了虚拟化ItemsPanel。在此模式下,仅呈现可见内容,然后将触发自动调整大小列。因此,如果您的ListView中没有多项内容,则可以通过附加属性VirtualizingStackPanel.IsVirtualizing关闭虚拟化模式,然后它可以正常运行:

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

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