当内部有大量物品时,ListView会在调整大小时闪烁黑色

时间:2016-08-08 22:18:28

标签: c# wpf

我有一个基于ListView的控件。 这是一个文件浏览器。 设置Path属性时,首先通过异步方法(使用Win32 API)加载所有文件系统项。 即使对于大量文件,这也非常快。无论如何,对于C:\ Windows \ System32我没有看到任何滞后。 然后,在等待每个64 ListView以显示操作完成之前添加的内容之后,这些项目将以64个批次添加到我的Dispatcher.Yield()。这再次使整个事情变得更快,反应更灵敏。

然而,有一个不是很快的操作:当我第一次需要一个文件的图标时,我必须进行系统调用。这个调用是在getter中进行的,它很聪明,它会尝试使用缓存(如果可用)。

加载视图是一个瞬间。

然而,当我加载一个巨大的目录(没问题,快速) - 然后调整窗口大小或最大化时 - 我会在控件调整大小之前看到一些黑色闪光。

首先窗口调整大小,添加的空间涂成黑色,然后出现较大的ListView。这是晚餐很烦人,喜欢破坏我的顺利体验。有没有办法避免这个黑色空间?

我尝试将Window背景设置为白色,没有帮助。我尝试将包含UserControl背景的ListView设置为白色。没有快乐。

ListView中的项目不多时,没有黑色闪光,但它仍然不够光滑。

那么 - 如何在调整控件大小时防止看到黑色背景?

1 个答案:

答案 0 :(得分:0)

如果有人对ListView存在性能问题 - 这里应该采取什么措施:

  1. 不要在UI线程上执行任何昂贵的操作。在我的情况下,它不完全是,但相似。违规代码隐藏在项构造函数中,它尝试在启动时进行一些字符串转换。非常糟糕的主意,所有昂贵的操作都转移到了吸气剂,解决了一半的问题。项构造函数应为空。没有初始值。根本没有初始化。所有属性都应该通过getter读取。这将导致每个视图执行20次此类操作,而不是20000次,但仅限于使用UI虚拟化。

  2. 使用MVVM模式,因此不要直接添加项目,创建项目源并将项目添加到源。这将允许内置的UI虚拟化,这在您拥有大量项目时非常重要。搜索" UI虚拟化ListView"在谷歌了解更多详情。这肯定解决了这个问题。

  3. 如果填充项目来源太慢,请考虑数据虚拟化。就我而言,这是不必要的。获得所有数据相对便宜 - 我们很好。如果不是 - 我们必须只获得当前需要显示的一大块数据。

  4. 更简单的控制模板可以在某些低端移动设备上稍微提高应用程序性能。

  5. 如果您在应用程序的任何位置使用非托管代码,请仔细检查,我忘记调用DestroyIcon一次,这会导致非常奇怪的意外行为。所以处理任何一次性的东西,销毁未使用的手柄等。三重确定它完成了,我浪费了无数个小时来调试这些事情。要明确:未发布的资源不会导致任何性能问题,它会导致其他意外行为,如奇怪的异常,消失的图标等。这些问题似乎来自ListView