【问题标题】:Make VirtualizingStackPanel not clean up already loaded items使 VirtualizingStackPanel 不清理已加载的项目
【发布时间】:2023-03-19 23:00:02
【问题描述】:

有什么方法可以让 Windows Phone 中的 VirtualizingStackPanel 仅在项目尚未加载时清理/重新虚拟化它们?

解释一下我想要什么:当我使用带有图像的重 ItemTemplate 加载大量项目列表时,我会使用 VirtualizingStackPanel 以避免阻塞 UI 并等到所有元素都已绘制完毕到屏幕上。

如果您在列表中滚动向下又好又慢,这很好。但问题是当您再次向上滚动查看已经加载过一次的项目时。由于VirtualizingStackPanel 现在已经清理了那些需要再次加载的元素。

我想要的是那些已经加载的项目不要被清理。

我不知道他们是怎么做到的,但 IMDb 应用似乎在他们的 top 250bottom 100 电影列表中使用了类似的东西。我还注意到它们不会在您滚动时加载图像,因此除非您在列表中静止不动,否则它不会阻塞 UI。

非常感谢任何帮助!

【问题讨论】:

  • 您实际上在问什么问题?你在这里的真正目标是什么?如果向下滚动的性能很好,为什么您对向上滚动不满意?或者您真的在问如何推迟项目模板中较重组件的加载,直到滚动在短时间内保持不变?清楚自己真正追求的是什么。
  • 我想我已经说得很清楚了:VirtualizingStackPanel 需要重新加载已经加载过一次的项目,当它们移出视图时。这是一件坏事,我不想这样。我想要的是已经创建的项目不会被卸载,然后在它们第二次进入视图时再次加载,即我希望它们不被清理。

标签: c# .net silverlight windows-phone-7 compact-framework


【解决方案1】:

作为警告,我的建议来自 WPF 背景,而不是 Silverlight 或 WP7。但根据我的经验,它们并没有那么不同。

首先我会检查更改VirtualizationMode 是否有帮助。将其设置为回收可能已经提高了您的性能。

否则,做你想做的事会更有挑战性。您需要创建自己的 VirtualizingPanel,并将其设置为动态管理创建项目。你会发现一组很好的文章here。但是,您无需清除“曾经可见但现在再次虚拟化的项目”,而是保留它们,以便最终实现所有项目。 我知道它有点含糊,我在这里有代码,如果需要,我可以将其用于我们的自定义工具栏,我可以发布其中的一些来解释如何做到这一点。 (同样不保证它也适用于 WP7)。

最好的问候

【讨论】:

  • 这看起来很有趣!即使它是用于 WPF 的,但概念是相同的。如果可行,我将通读博客文章并标记为已接受:)
猜你喜欢
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
  • 2013-03-14
  • 1970-01-01
  • 2014-07-21
  • 1970-01-01
相关资源
最近更新 更多