【问题标题】:DataBinding in Windows Phone is blocking UI threadingWindows Phone 中的 DataBinding 阻塞了 UI 线程
【发布时间】:2013-05-03 06:16:30
【问题描述】:

我正在尝试执行标准 - 以非常快速和流畅的方式绑定从 REST API 调用接收到的数据列表(包括图像) - 这本身就是一个悖论。我有 2 个服务调用,每个调用大约需要 2 秒才能完成,因此我可以异步/等待它们,但是根据返回的数据,然后我在内存中构建其他列表(observableCollection)并将它们绑定回页面中的 ListBox。

问题:

  1. 这个实际的绑定似乎锁定了 UI 线程,我怎样才能以惰性方式异步加载我的页面 - listBox by listBox(甚至逐项)?我想放置一个占位符图像,当最终绑定时,占位符被绑定图像替换。有任何想法吗?构架?工具?

  2. 绑定实际图像时,我的 DataTemplate 中的其他数据实际上会在渲染图像时在屏幕上跳跃。看起来很糟糕......我希望至少能够先绑定图像,然后再绑定 dataTemplate 中的其他控件?任何能让它看起来更平滑的东西都会有所帮助。

提前致谢。

【问题讨论】:

    标签: image data-binding listbox windows-phone-8


    【解决方案1】:

    我怀疑您在 (2) 中的问题将通过占位符图像解决(假设它与下载的图像大小相同)。

    我怀疑您在 (1) 中的“锁定”问题是您在 async 方法返回的 Task 上调用 Wait 或 Result。在许多情况下,这会导致死锁,正如我所解释的 in a recent MSDN article 和 on my blog。

    我认为您真正想要的是一种启动Task 并在完成时获得数据绑定通知的方法。我开发了一个set of types (TaskCompletionNotifier) 来帮助解决这种情况。查看my blog post on async properties 的末尾以获取示例。你可能也对my blog post on async constructors感兴趣。

    【讨论】:

      【解决方案2】:

      (1) 如果项目列表很大,一次绑定它们会导致 UI 线程出现一些停滞。一种解决方法是一次添加几个项目并暂停,以便 UI 线程可以在继续之前将新帧发送到合成器。

      public async void AddObjects(List<object> objects)
      {
          for(int i = 0; i < objects.Count; i++)
          {
              _myObservableCollection.Add(objects[i]);
              if(i % 10 == 0) await Task.Delay(100);
          }
      }
      

      (2) DataTemplate 中的图片应该设置一个固定的宽度和高度,这样就不会随着实际下载的图片而改变。或者,如果您可以在 API 调用中从服务中获取宽度和高度,请在下载之前将图像宽度/高度绑定到这些值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多