【问题标题】:How to speed up ListBox population from ObservableCollection in WP app?如何从 WP 应用程序中的 ObservableCollection 加速 ListBox 填充?
【发布时间】:2014-05-27 17:20:59
【问题描述】:

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

当 ObservableCollection 有 20 多个项目并在代码中重新填充时,屏幕上的 ListBox 更新速度明显变慢。看来,我需要 1-2 秒才能看到新内容。

什么是最好的策略来快速完成这项工作,而不会出现如此明显的延迟?

【问题讨论】:

标签: silverlight windows-phone-8 binding listbox observablecollection


【解决方案1】:

以下是我的提示和技巧:

  • 对 ListBox 的 ItemsPanel 使用 VirtualizingStackPanel。为获得最佳效果,项目应明确设置高度。

  • 不要一次添加 100 个元素。尝试一次添加 10 个,然后释放 UI 线程一段时间(50-200 毫秒),然后再添加另外 10 个,依此类推。试验一下这个数字。

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

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

  • 研究和实验。还有其他方法可以做到这一点吗?什么可以使它更快/更慢?恕我直言,尝试不同的策略通常非常有帮助 - 您了解事物的行为方式,与它们相关的一些问题,以及什么对一种情况最好,对另一种情况可能不是最优的 - 所以你知道和试验得越多 - 越好。

编辑

还有一件事:

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

【讨论】:

  • 事实上,我使用的是众所周知的 ReorderListBox 控件(修改了问题以表明这一点)。我检查了它是实际的可视化树,VirtualizingStackPanel 被用作默认的 ListBox 实现。
  • 关于延迟加载,和VirtualizingStackPanel一样吗?
  • @TecMan 我认为你真的需要考虑我建议的其他事情。尤其是第二个。关于延迟加载 - 在需要它们之前,您的项目根本不会出现在列表中。我想这就是建议的。您也可以延迟加载对象/视觉元素的某些部分,但我认为这不是真正的问题。
  • 感谢您的所有建议!我今天已经对其中一些进行了实验。其中之一是 steveg89 在对我的问题的第一条评论中建议的RangeObservableCollection。它有助于稍微改善这种情况,但作用不大。事实是,即使我们执行 AddRange,otifyCollectionChangedAction.Reset 仍然会被发送。这开始起作用,就好像我们重新加载了所有列表项一样,在我的场景中它对 20-30 个项目不起作用。我会继续尝试...
猜你喜欢
  • 2013-06-11
  • 1970-01-01
  • 1970-01-01
  • 2017-07-27
  • 2019-06-29
  • 2014-08-08
  • 1970-01-01
  • 1970-01-01
  • 2019-05-12
相关资源
最近更新 更多