【问题标题】:Frozen UI when filling a ListBox填充 ListBox 时冻结的 UI
【发布时间】:2013-02-18 22:28:30
【问题描述】:

我有一个带有四个枢轴的枢轴页面。在两个枢轴中,我有一个 ListBox,我以网格的形式填充信息。我将 ListItems 绑定到一个 ObservableCollection,其中填充了从 WCF 异步获取的信息。

但是,当设置 DataContext 并且 UI 正在用数据填充 ListBox 时,UI 似乎冻结了。 ListItems 越多,冻结的时间越长。

编辑:校准。我仍然可以向上/向下滚动页面,但我无法滑动导航到不同的枢轴。转换发生在 UI 解冻后。

有什么方法可以在不冻结 UI 的情况下填充 ListBox?

编辑:一些示例代码松散地解释了发生了什么。

列表框

<ListBox Name="lbInterruptYesterday" ScrollViewer.VerticalScrollBarVisibility="Disabled"
    ItemsSource="{Binding Interrupts}" 
    ItemTemplate="{StaticResource InterruptListItem}" Tap="Interrupt_OnTap">
</ListBox>

Interrupts 是一个包含 Interrupt 对象的 ObservableCollection。

InterruptListItem 包含一个带有 TextBlocks 的网格,文本绑定到一个 Interrupt-object 中的变量。

我通过对 WCF 的异步调用来获取数据。完成后我会这样做:

(sender, e) => Deployment.Current.Dispatcher.BeginInvoke(() =>
    {
        //Some code handling the result which I put in the ObservableCollection
        Production.Interrupts.add(new Interrupt());
        //Set the DataContext    
        DataContext = Production;
    });

当设置 DataContext 时,UI 会冻结,直到它被更新。

【问题讨论】:

  • 你能发布你的代码吗?一般来说,情况不应该如此。
  • 我认为这应该足以理解一切是如何运作的。

标签: silverlight windows-phone-7


【解决方案1】:

可能是因为ObservableCollection 正在触发一个事件,导致 UI 更新您添加的每个项目。如果添加大量项目,可能会很耗时。解决方案是创建一个更聪明的 ObservableCollection,您可以在事件触发方面暂停和恢复它。这是example,您可以尝试看看是否有帮助。

【讨论】:

  • 没有。即使我只触发一次事件,问题似乎仍然存在。不过我必须澄清一下。我似乎能够向上/向下滚动页面,但我无法滑动以导航到不同的枢轴。我更新了问题。
  • 那么我想是时候做一些分析了:msdn.microsoft.com/en-us/library/windowsphone/develop/…
  • 这基本上告诉了我我已经知道的一切。来自 UI 的 CPU 使用率高,随后出现“UI 卡顿”。而且我无法成功分析可以优化的任何地方。 UI 似乎一次绘制了完整的列表框,这需要很长时间。如果我可以让它只在我添加一些东西时绘制新项目,而不是完整的列表框,它将解决我的问题。
  • 您的 ListBox 中有多少项?另一种选择是使用 LongListSelector 控件(如果您使用的是 WP7,那么您将需要 Microsoft 的 Windows Phone Toolkit)。它支持项目虚拟化,即仅在必要时将项目加载到视图中。
  • 如果更改为 Canvas 可以解决问题,我猜您会遇到 Windows Phone 和 Grid 面板的架构限制。我只能建议以某种方式简化您的 ItemTemplate。无法在 Windows Phone 上的 Dispatcher(UI 线程)之外绘制控件。
猜你喜欢
  • 2021-04-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2016-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多