Silverlight 如何在WP应用程序中从ObservableCollection加速列表框填充?

Silverlight 如何在WP应用程序中从ObservableCollection加速列表框填充?,silverlight,windows-phone-8,binding,listbox,observablecollection,Silverlight,Windows Phone 8,Binding,Listbox,Observablecollection,我有一个WP8 Silverlight应用程序。其中一个页面包含一个修改后的ListBox控件,该控件通过ItemsSource属性绑定到ObservableCollection 当ObservableCollection有20多个项目,并以代码重新填充时,屏幕上列表框的更新速度明显较低。看起来,我需要1-2秒才能看到新内容 什么是快速完成这项任务的最佳策略,而不会造成如此严重的延迟?以下是我的技巧: 使用ListBox“ItemsPanel”的虚拟化StackPanel。为获得最佳结果,项目

我有一个WP8 Silverlight应用程序。其中一个页面包含一个修改后的ListBox控件,该控件通过ItemsSource属性绑定到ObservableCollection

当ObservableCollection有20多个项目,并以代码重新填充时,屏幕上列表框的更新速度明显较低。看起来,我需要1-2秒才能看到新内容


什么是快速完成这项任务的最佳策略,而不会造成如此严重的延迟?

以下是我的技巧:

  • 使用ListBox“ItemsPanel”的虚拟化StackPanel。为获得最佳结果,项目应明确设置高度

  • 不要一次添加100个元素。尝试一次添加10个,然后释放UI线程一段时间(50-200ms),然后再添加10个,以此类推。用数字做实验

  • 不要使用数据绑定。是的,这很酷,但它比手动设置值慢。(当然,绑定一些东西不是问题,但是当您有200个项目和10个绑定属性时,它可能会变慢。)

  • 按照AMR的建议,使用延迟加载。其思想是只加载屏幕上可见的项目。不过,你必须在互联网上搜索更多信息

  • 研究和实验。你还有别的办法吗?什么能使它更快/更慢?我认为尝试不同的策略通常是非常有帮助的-你了解事物的行为,一些与它们相关的问题,以及什么对一个场景是最好的,对另一个场景可能不是最佳的-所以你知道的越多,体验的越多越好

编辑

还有一件事:

  • 如果可能,简化ItemTemplate的可视树。这很少是一种选择,但有时会有所帮助

我认为,如果您在仅仅20分钟后就放慢速度,您会有非常复杂的项目。我在过去找到的最好的方法是从Observable集合继承并创建一个“AddRange”方法。类似于下面的链接:包装您的集合并创建一个load@AMR,我可以在网上找到一个这样的例子吗?我不知道,你可以吗?请尝试搜索此信息。很容易找到:事实上,我使用的是著名的ReorderListBox控件(修改了这个问题以表明这一点)。我已经检查了它的实际视觉树,ValualIZIDEN STACKPAND用于默认的ListBox实现。至于懒惰加载,虚拟化STACKPAND是一样的吗?@特克曼,我认为你真的需要考虑我建议的其他事情。尤其是第二个。关于延迟加载-您的项目在需要之前根本不在列表中。我想这就是建议。你也可以懒洋洋地加载部分对象/视觉元素,但我认为这不是真正的问题。谢谢你的建议!我今天用其中一些做了实验。其中一个是steveg89在对我的问题的第一次评论中提出的。这对改善情况有一点帮助,但帮助不大。事实上,即使我们执行AddRange,仍然会发送otifyCollectionChangedAction.Reset。这就好像我们重新加载了所有列表项一样开始工作,在我的场景中,它对20-30个项目不起作用。我会继续我的尝试。。。