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

标签 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? 不同其他人喜欢它,因为它们仍然会触发可见内容的当前调整大小行为,并且不会处理所有内容。

最佳答案

问题是 ListViewItemsPanel 默认启用虚拟化。在此模式下,仅渲染可见内容,然后触发自动调整大小列。因此,如果您的 ListView 中没有太多项目,您可以通过附加属性 VirtualizingStackPanel.IsVirtualizing 关闭虚拟化模式,然后它将按预期工作:

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

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

关于c# - 自动调整大小以适合所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32851781/

相关文章:

c# - 在多维数组中查找值并返回所有项目 c#

c# - 如何在 Reactive Extension C# 中将 IObserable<bool> 转换为 bool

wpf - 根据多个属性设置可见性

c# - Trace.Assert 没有中断,也没有显示消息框

android - TextView 在 ListView 下面,但是在 parent 的底部,为什么?

c# - 我应该使用 ToList() 深度克隆 IList 吗?

c# - HttpContext的线程安全

c# - 避免调试器因线程中捕获的异常而停止

java - Android ListView : how to use fast scrolling and alphabetical ordering

android - ListView 每一行的滑动检测