1

我想知道 WindowsPhone Listbox 控件上是否有其他分页数据的解决方案。我习惯于通过手动检查滚动条位置来分页数据,当它到达屏幕末尾时,会加载更多数据。

我想问一下,是否有任何其他解决方案(更好)这样做(WP7 或 WP8)。我提到的解决方案与编写大量代码(自定义事件、滚动侦听器等)有关。我认为,可能有一个更简单的解决方案,因为 WindowsPhone sdk 8.0 已经发布......

4

2 回答 2

2

WP8 无限滚动的关键是 LongListSelector 控制和处理两个事件:

ItemRealized(加载项)和 ItemUnrealized(删除项)。

此事件会根据检测到的静态模板大小(高度)自动引发。这是一个完全自动的按需操作。引擎“知道”何时应该获取新项目或删除旧项目。

基本的:

  1. 您必须手动设置模板大小。否则,同时加载的项目的数量是不可预测的。例如,如果您的模板中有图像,则它不会算作空间,除非它具有特定的高度。
  2. List 项的 ContentPresenters 似乎可以回收。因此,如果您从代码更改一个项目模板,您可以神奇地获得另一个项目的新模板!;) 所以...如果您需要两个或更多,请记住您的 ItemTemplates 并在每个 ItemRealized 事件上设置它。
  3. 卸载 BitmapImage 数据非常有问题。如果您的项目模板中有 Image,您应该在 ItemUnrealized 事件中手动释放它缓存。并且还通过将 Image.Source 设置为 null 来销毁和重置绑定。并将原始源 BitmapImage 设置为具有最小 decodepixelwidth/height 的新的小型源(您不能将其设为空)。我发现这是对抗内存泄漏的唯一方法。这是详细信息https://stackoverflow.com/a/14225871/1449841
  4. 数据虚拟化的绑定集合可以随心所欲(百万即可)。因此,您应该绑定该集合一次,您唯一的业务将是通过提到的事件加载和卸载项目数据。
于 2013-01-13T22:52:28.327 回答
0

您可以使用HorizontalCompressionand的 VisualStatesGroups VerticalCompression,这样您就可以检测到您何时位于ListBox.

自从 Mango 以来就一直存在这种情况,因此它不是 WP8 的新功能,但绝对听起来比您当前的“hacky”事件处理程序解决方案更好。

在 MSDN 博客上阅读它 - “Windows Phone Mango 更改,列表框:如何检测压缩(滚动结束)状态?”

如果您不想更改控件,LongListSelector可以在Windows Phone Toolkit中找到(注意这是 WP8 中的原生工具),这肯定是解决问题的更好方法,链接文章中提到这是新的方法来做旧文章对 Mango 的看法。

于 2013-01-09T10:02:57.467 回答