我有一个Silverlight 2应用程序,其中包含一个包含动画的“正在加载数据...”消息。当Web服务返回数据并且数据正在加载到可观察的集合中时 - 动画会冻结(这可能会在加载数据时持续几秒钟,并给人一种错误的印象。)
可视化集合,它被数据绑定到视图中的项目控件。
我假设发生的事情是当数据被添加到可观察集合时,正在为数据绑定控件构建可视树 - 这发生在UI线程上。
我是否还有降低数据加载的优先级,以便ui线程上的动画可以继续 - 即使在UI线程上有大量的数据工作?
感谢 迈克尔
答案 0 :(得分:1)
我不知道你是否得到了这个答案,但我在这里。
尝试使用BackgroudWorker将重型指令放在那里。
这是一个很好的例子:http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx
如果您有任何问题,请告诉我,或者如果您已经解决了这个问题,请告诉我。
答案 1 :(得分:0)
我一直在使用具有Indeterminate状态的进度控制,然后将其放在项目控件顶部的半透明背景的控件中。我没有看到它在进行Web服务调用时停止动画,返回对象被处理为ViewModel,ItemControl正在呈现更新的视图模型。
我认为您可以以非常简单的方式自定义进度条模板,并将“加载数据...”消息添加为TextBlock。我在Progress控件上方也有一条Loading ...消息。
答案 2 :(得分:0)
你说回调发生在UI线程上是对的。要解决您的问题,您可以将其设置为异步,以便它在后台线程上发生,然后构建一个新的可观察集合并在一个操作中替换现有集合。 例如:
private SynchronizationContext _uiThread = SynchronizationContext.Current;
public void UpdateUIAsynchronously(ICollection<Data> data)
{
ObservableCollection<Data> temp = new ObservableCollection<Data>();
foreach(Data currentData in data)
{
temp.Add(currentData);
}
_uiThread.Post(delegate(object o) { myDataGrid.ItemsSource = temp }, null);
}
在我的开发中,我发现对于DataGrid,我可以清除并在UI线程上添加新元素而不会影响性能。也许你可以重构你的UI代码?
答案 3 :(得分:-1)
您的动画未运行,因为您的JS正在处理返回的数据。 (单线程浏览器。)
解决方案:您的JS加载sw需要定期向浏览器屈服,以使浏览器能够执行一些动画。
有关如何操作的详细信息,请参阅我的回答Why is jQuery Ajax so slow on IE7?。