【问题标题】:Paging data / infinite scrolling on Windows PhoneWindows Phone 上的分页数据/无限滚动
【发布时间】:2013-01-09 09:56:15
【问题描述】:

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

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

【问题讨论】:

    标签: c# windows-phone-7 windows-phone-8


    【解决方案1】:

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

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

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

    基本:

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

    【讨论】:

      【解决方案2】:

      您可以使用 HorizontalCompressionVerticalCompression 的 VisualStatesGroups,以便能够检测到您何时在 ListBox 的底部附近。

      这从 Mango 开始就已经存在,因此不是 WP8 的新功能,但绝对听起来比您当前的“hacky”事件处理程序解决方案更好。

      Read about it on MSDN Blog - "Windows Phone Mango change, Listbox: How to detect compression(end of scroll) states ?"

      如果您不打算更改控件,可以在Windows Phone Toolkit 中找到LongListSelector(注意这是WP8 中的原生),可能是certainly be a better way to approach the problem,链接文章中提到这是用新方法来完成旧文章对 Mango 的理解。

      【讨论】:

      • 谢谢。您的解决方案实际上比我的更简单,但我想到了类似 ISupportIncrementalLoading in Windows 8 Store Apps...
      • @user1482528 我已经编辑了我的答案,有一个LongListSelector 可能是合适的。不幸的是,ISupportIncrementalLoading 仅适用于 WinRT,并没有适用于 Windows Phone 8。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多