【发布时间】:2015-01-29 18:08:46
【问题描述】:
我有某种文件浏览器,它使用 ListView 来显示文件。当我打开一个包含数千个文件的文件夹时,UI 会在 ListView 刷新时挂起大约 5 秒。
有什么办法可以避免吗?
谢谢
【问题讨论】:
标签: c# wpf listview refresh lag
我有某种文件浏览器,它使用 ListView 来显示文件。当我打开一个包含数千个文件的文件夹时,UI 会在 ListView 刷新时挂起大约 5 秒。
有什么办法可以避免吗?
谢谢
【问题讨论】:
标签: c# wpf listview refresh lag
将项目添加到 ListView 的数据源,并将 DispatcherPriority 设置为 Background。
Application.Current.Dispatcher.BeginInvoke(
DispatcherPriority.Background,
new Action(() => AddNewITemToList(newItem));
【讨论】:
虚拟化对于像这样的大型集合来说是必须的。如果没有它,WPF 将不得不提前为列表中的每个项目创建一个可视化树。
只是预感,但您是否使用 ObservableCollection 将文件集合绑定到 ListBox?
我遇到了大型集合和 ObservableCollection 的性能问题。您只能在 UI 线程上添加/删除项目 - 如果您正在遍历文件结果并将它们添加到可观察集合中,那么您将遇到这种延迟。
在这种情况下,最好的解决方案是将您的文件列表编译为一个单独的列表,并创建一个新的 ObservableCollection,并通过构造函数传入该列表。这样可以最大限度地减少对 UI 线程的影响。
【讨论】:
您现在遇到的性能问题与一个事实有关,即控件会为找到的所有数千个文件创建 UI 元素,即使只呈现其中的一小部分。
您需要至少使用ListView.VirtualMode 在您的控件中实现某种分页。
实际上,在这种模式下,控件的ListViewItem 是动态创建的,因此您可以使用其中的ItemsCollection,但您可以控制创建所需的每个项目通过 UI 在单个时刻,因此也提高了性能。
还有Data Virtualization的选项,绑定到你的控件的数据也是虚拟化的,而不仅仅是控件的UI。
【讨论】: