0

我有一个带有 ListView 的表单(.NET 4.5 VS.2015),它可能包含几百甚至一千多行。实验已经表明,表单会陷入僵局且无响应,因为它在任何给定时间仅显示大约 20 个时尝试加载所有 ListViewItems。

因此,我使用简单的缓存在 ListView 上实现了虚拟模式。我已经为 RetrieveItems 和 CacheVirtualItems 事件设置了 VirtualListSize、启用了虚拟模式并连接了事件处理程序。

现在,根据文档,您相信 CacheVirtualItems 将在 RetrieveItems 之前被调用,以允许您的缓存填充 ListView 打算查看的项目范围。

但就我所见,CacheVirtualItems 在第一个 RetrieveItems 之前从未被调用过!您希望它被调用,以便您可以创建缓存并预填充它(至少设置容量),然后在缓存未命中时适当地填充。

我不是很好理解吗?如果没有首先调用 CacheVirtualItems 让您的应用程序为请求做准备,那么有什么意义呢?

4

1 回答 1

2

WinFormListView是本机控件的包装器,虽然在 RetrieveVirtualItem 之前引发 CacheVirtualItems 事件似乎是可取的,但本机控件的行为排除了这种情况。注释部分中LVN_ODCACHEHINT的文档指出:

请注意,此通知代码并不总是准确表示 LVN_GETDISPINFO 将请求的项目。因此,如果在处理 LVN_GETDISPINFO 时请求的项目没有被缓存,应用程序必须准备好从缓存之外的源提供请求的信息。

这些是Listview控件在引发相关事件时响应的消息。请参阅从第 6010 行开始的 ListView WMReflectNotify 方法的代码。

于 2016-08-29T22:40:26.247 回答