如何在 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 将自行处理请求更多项目。还要确保您没有将GridViewItemsPanel 更改为不支持UI 虚拟化的ItemsPanel - 例如。 VariableSizedWrapGrid.

还要确保您不会因为任何其他原因而简单地发生内存泄漏。通常,UI 虚拟化(默认)的 200 项网格不应该使用那么多内存,除非您的拇指实际上比您需要显示它们的分辨率大得多。检查this question 以了解调试泄漏的方法。

【讨论】:

谢谢,伙计。你知道我在哪里可以找到有关如何以较小尺寸加载图像的信息吗? VariableSizedWrapGrid 中使用ISupportIncrementalLoading 的任何解决方法? @adheus 检查 WinRT XAML 工具包中的 Tim Heuer method 以获得有关如何以特定分辨率加载图像的灵感,但如果您可以控制图像的来源 - 最好简单地创建/请求特定分辨率的图像。 @Xyroid 我以前实际上从未使用过ISupportIncrementalLoading,尽管我在回答here 时使用过FileInformationFactory.GetVirtualizedFilesVector。您在解决方法中需要什么具体的东西? VariableSizedWrapGrid 没有虚拟化,所以即使它确实与数据虚拟化一起使用,它也会泄漏数据。 @Xyroid 我建议不要使用VariableSizedWrapGrid 处理超过几到几十个项目。如果你真的需要 - 你可能应该考虑在项目滚动到视图时延迟加载数据(例如图像)和某种循环缓冲区来卸载最近未请求或不在视图中的数据.然后还使用附加属性将GridViewItemVariableSizedWrapGrid.RowSpan/ColumnSpan 属性绑定到数据项或尝试从ItemTemplate 遍历可视化树以设置父GridViewItem 的跨度。所有骇人听闻的东西。【参考方案2】:

您可以自己创建拇指:仅创建较小的图像 - 仅此而已。

   new BitmapImage(new Uri(Path)) DecodePixelWidth = 200

【讨论】:

以上是关于如何在 WinRT 上实现延迟加载 GridView?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 mongodb 数据延迟加载角度

如何通过 vue-class-component 使用 Vue Router 延迟加载?

使用 MEAN 堆栈延迟加载 (AngularJS 1.x)

如何在加载数据时在 AsyncTask 上实现旋转 ProgressBar?

如何在已加载到 PDFView 的 PDF 上实现文本到语音

在 WinRT 中,我如何加载图像,然后在写入之前等待它加载所需的时间?