【问题标题】:C# WPF refresh ListView with lot of items hangsC# WPF 刷新 ListView 有很多项目挂起
【发布时间】:2015-01-29 18:08:46
【问题描述】:

我有某种文件浏览器,它使用 ListView 来显示文件。当我打开一个包含数千个文件的文件夹时,UI 会在 ListView 刷新时挂起大约 5 秒。

有什么办法可以避免吗?

谢谢

【问题讨论】:

    标签: c# wpf listview refresh lag


    【解决方案1】:

    将项目添加到 ListView 的数据源,并将 DispatcherPriority 设置为 Background。

    Application.Current.Dispatcher.BeginInvoke(
        DispatcherPriority.Background,
        new Action(() => AddNewITemToList(newItem));
    

    【讨论】:

      【解决方案2】:

      虚拟化对于像这样的大型集合来说是必须的。如果没有它,WPF 将不得不提前为列表中的每个项目创建一个可视化树。

      只是预感,但您是否使用 ObservableCollection 将文件集合绑定到 ListBox?

      我遇到了大型集合和 ObservableCollection 的性能问题。您只能在 UI 线程上添加/删除项目 - 如果您正在遍历文件结果并将它们添加到可观察集合中,那么您将遇到这种延迟。

      在这种情况下,最好的解决方案是将您的文件列表编译为一个单独的列表,并创建一个新的 ObservableCollection,并通过构造函数传入该列表。这样可以最大限度地减少对 UI 线程的影响。

      【讨论】:

        【解决方案3】:

        您现在遇到的性能问题与一个事实有关,即控件会为找到的所有数千个文件创建 UI 元素,即使只呈现其中的一小部分。

        您需要至少使用ListView.VirtualMode 在您的控件中实现某种分页。

        实际上,在这种模式下,控件的ListViewItem 是动态创建的,因此您可以使用其中的ItemsCollection,但您可以控制创建所需的每个项目通过 UI 在单个时刻,因此也提高了性能。

        还有Data Virtualization的选项,绑定到你的控件的数据也是虚拟化的,而不仅仅是控件的UI

        【讨论】:

          猜你喜欢
          • 2019-05-26
          • 1970-01-01
          • 1970-01-01
          • 2017-04-09
          • 2012-09-21
          • 1970-01-01
          • 1970-01-01
          • 2020-02-17
          • 1970-01-01
          相关资源
          最近更新 更多