延迟加载虚拟化列表框中的图像

我试图以异步方式为Listbox中的每个项目延迟加载缩略图。

 

由于列表框是虚拟化的,因此只有当项目位于显示端口或靠近显示端口时,才会调用Thumbnail属性的getter。

 public BitmapSource Thumbnail { get { TriggerLoad(); return _thumbnail; } } 

我正在等待在TriggerLoad函数中加载Thumbail的昂贵操作,但UI不是非常敏感,尤其是当您尝试快速滚动大型项目列表时。

 private async void TriggerLoad() { if (!LoadTriggered) { LoadTriggered = true; var cacheItem = _cache[key] as CacheItem; if (cacheItem != null) await LoadBitmapFromCache(cacheItem); // returns a Task else await LoadBitmapFromService(Id); // returns a Task } } 

在这里找到了类似的问题,但它不是关于将项目加载到列表框。 有没有更好的方法来延迟加载只绑定到Listbox的数据的一部分?

编辑:我尝试了PriorityBinding和IsAsync选项,滚动并不比我目前的解决方案更好。

听起来虽然您的UI正在虚拟化,但它并没有足够快地加载更新的图像以跟上用户的滚动。 尝试将VirtualizationMode设置为Recycling并设置更长的CacheLength。 像这样:

  

将CacheLength从“1,1”增加到“2,2”意味着在向用户显示页面之前和之后将两个“页面”(或视图端口值项目)加载到存储器中。 您的应用程序将消耗更多的内存,但用户将能够进一步,更快地滚动,然后再运行未加载的图像。