【问题标题】:Autosize to fit All Content自动调整大小以适合所有内容
【发布时间】:2015-12-27 09:28:11
【问题描述】:

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

【问题讨论】:

    标签: c# wpf listview gridviewcolumn


    【解决方案1】:

    问题是ListView 的ItemsPanel 默认启用虚拟化。在这种模式下,只会呈现可见内容,然后会触发自动调整列。因此,如果您的ListView 中的项目不多,您可以通过附加属性VirtualizingStackPanel.IsVirtualizing 关闭虚拟化模式,然后它会正常工作:

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

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

    【讨论】:

    • 将IsVirtualizing 设置为False 没有做任何事情。您的意思是除了手动调整大小之外还必须这样做?
    • @OhBeWise 奇怪的是它对我有用。如果它不适合你,那么我不知道。您可以尝试寻找其他方法。当然,我目前对任何其他方法都不感兴趣,至少这对我来说已经有效,所以每当我遇到同样的问题时,我都会使用它。对于您的问题,您无需手动调整大小,只需将 IsVirtualizing 设置为 false。顺便说一句:这里的自动调整大小最初只有效,如果您有任何数据在运行时更新/添加,我不确定它是否有效(没有测试那个场景) .
    • 经过一些额外的测试,我发现您的解决方案通常是正确的。但是,我有一个类似于this ListView Layout Manager 的附加 Behavior 类,遗憾的是,出于某种原因,它阻止了它的工作。
    • 事实证明,对我来说,错误非常具体到在 ListView Behavior 类中为指定的 GridViewColumn 设置 MinWidth 和/或 MaxWidth - 这是我将拥有的弄清楚。感谢您的解决方案!
    猜你喜欢
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 2014-07-02
    • 2013-06-05
    • 2021-09-16
    • 2011-11-03
    • 2021-12-17
    相关资源
    最近更新 更多