C# 在Windows Phone上分页数据/无限滚动

C# 在Windows Phone上分页数据/无限滚动,c#,windows-phone-7,windows-phone-8,C#,Windows Phone 7,Windows Phone 8,我想知道WindowsPhone Listbox控件上是否有其他分页数据的解决方案。 我习惯于通过手动检查滚动条的位置来分页数据,当它到达屏幕的末尾时,就会加载更多的数据 我想问,有没有其他更好的解决方案(WP7或WP8)。我提到的解决方案与编写大量代码(自定义事件、滚动侦听器等)有关。我认为,随着WindowsPhone sdk 8.0的发布,可能会有更简单的解决方案 您可以使用Visual States组,这些组是水平压缩和垂直压缩,这样您就可以在列表框的底部附近检测 这是自Mango以来就

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


我想问,有没有其他更好的解决方案(WP7或WP8)。我提到的解决方案与编写大量代码(自定义事件、滚动侦听器等)有关。我认为,随着WindowsPhone sdk 8.0的发布,可能会有更简单的解决方案

您可以使用Visual States组,这些组是
水平压缩
垂直压缩
,这样您就可以在
列表框的底部附近检测

这是自Mango以来就存在的,所以不是一个新的WP8特性,但听起来肯定比您当前的“黑客”事件处理程序解决方案要好


如果您不想更改控件,则在(请注意,这是WP8中固有的)中可以找到
LongListSelector
,它可能,链接文章中提到,这是一种新的方式,可以实现老文章为Mango提供的功能。

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

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

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

重要的:

  • 必须手动设置模板大小。否则,同时加载的项目的计数是不可预测的。例如,如果模板中有图像,则该图像不算作空间,除非其具有特定高度
  • 列表项的ContentPresenter似乎正在回收。因此,如果您从代码中更改一个项目模板,您可以神奇地将另一个项目的新模板设置为!;)所以记住您的ItemTemplates,如果需要两个或多个,请在每个ItemRealized事件上设置它
  • 卸载BitmapImage数据有很多问题。如果项目模板中有图像,则应在ItemUnrealized事件上手动释放图像缓存。还可以通过将Image.Source设置为null来销毁和重置绑定。并将原始源位图图像设置为具有最小解码像素宽度/高度的新小尺寸源(您不能将其置空)。我发现这是防止内存泄漏的唯一方法。详情如下
  • 数据虚拟化的绑定集合可以是您想要的大小(可以是百万)。因此,您应该绑定该集合一次,您唯一的业务就是通过所提到的事件加载和卸载项目数据
    谢谢您的解决方案实际上比我的更简单,但我考虑过类似于Windows 8应用商店应用程序中的ISupportIncrementalLoading…@user1482528我已经编辑了我的答案,有一个
    长列表选择器
    ,它可能是合适的。不幸的是,
    ISupportIncrementalLoading
    仅适用于WinRT,没有应用于Windows Phone 8。