如何在 WinRT 上实现延迟加载 GridView?
Posted
技术标签:
【中文标题】如何在 WinRT 上实现延迟加载 GridView?【英文标题】:How to implement a lazy load GridView on WinRT? 【发布时间】:2013-06-10 14:25:01 【问题描述】:我需要实现一个拇指网格视图。但是当我的应用点击 200 个拇指时,它开始出现内存问题(当然)。我需要实现延迟加载,但我不知道如何检测滚动查看器在 gridview 上的位置,因此我可以在它到达末尾时尝试加载更多图像。
这是我的 gridview 布局:
有人知道怎么做吗?
【问题讨论】:
【参考方案1】:在您的源集合中实现ISupportIncrementalLoading
以支持数据虚拟化,GridView
将自行处理请求更多项目。还要确保您没有将GridView
的ItemsPanel
更改为不支持UI 虚拟化的ItemsPanel
- 例如。 VariableSizedWrapGrid
.
还要确保您不会因为任何其他原因而简单地发生内存泄漏。通常,UI 虚拟化(默认)的 200 项网格不应该使用那么多内存,除非您的拇指实际上比您需要显示它们的分辨率大得多。检查this question 以了解调试泄漏的方法。
【讨论】:
谢谢,伙计。你知道我在哪里可以找到有关如何以较小尺寸加载图像的信息吗? 在VariableSizedWrapGrid
中使用ISupportIncrementalLoading
的任何解决方法?
@adheus 检查 WinRT XAML 工具包中的 Tim Heuer method 以获得有关如何以特定分辨率加载图像的灵感,但如果您可以控制图像的来源 - 最好简单地创建/请求特定分辨率的图像。
@Xyroid 我以前实际上从未使用过ISupportIncrementalLoading
,尽管我在回答here 时使用过FileInformationFactory.GetVirtualizedFilesVector
。您在解决方法中需要什么具体的东西? VariableSizedWrapGrid
没有虚拟化,所以即使它确实与数据虚拟化一起使用,它也会泄漏数据。
@Xyroid 我建议不要使用VariableSizedWrapGrid
处理超过几到几十个项目。如果你真的需要 - 你可能应该考虑在项目滚动到视图时延迟加载数据(例如图像)和某种循环缓冲区来卸载最近未请求或不在视图中的数据.然后还使用附加属性将GridViewItem
的VariableSizedWrapGrid.RowSpan/ColumnSpan
属性绑定到数据项或尝试从ItemTemplate
遍历可视化树以设置父GridViewItem 的跨度。所有骇人听闻的东西。【参考方案2】:
您可以自己创建拇指:仅创建较小的图像 - 仅此而已。
new BitmapImage(new Uri(Path)) DecodePixelWidth = 200
【讨论】:
以上是关于如何在 WinRT 上实现延迟加载 GridView?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 vue-class-component 使用 Vue Router 延迟加载?
使用 MEAN 堆栈延迟加载 (AngularJS 1.x)
如何在加载数据时在 AsyncTask 上实现旋转 ProgressBar?