0

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

问题:

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

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

提前致谢。

4

2 回答 2

0

(1) If the list of items is large, binding them all at once will cause some stalling on the UI thread. One fix is to add the items a few at a time and pause so that the UI thread can get a new frame to the compositor before continuing.

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) You should set a fixed width and height on the images in the DataTemplate, so that it does not change as the image is actually downloaded. Alternately, if you can fetch the width and height from your service in the API calls, bind the image width/height to those values before it gets downloaded.

于 2013-05-09T00:10:18.640 回答
0

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

我怀疑您在(1)中的“锁定”问题是您正在调用WaitResult由方法Task返回。async在许多情况下,这会导致死锁,正如我在最近的 MSDN 文章我的博客中所解释的那样。

我认为您真正想要的是一种启动 aTask并在完成时获得数据绑定通知的方法。我开发了一组类型 ( TaskCompletionNotifier)在这种情况下有所帮助。查看我关于属性的博客文章async的结尾以获取示例。您可能还对我关于构造函数的博文async感兴趣。

于 2013-05-08T22:34:59.277 回答