0

我有一个 Silverlight 2 应用程序,其中包含一个包含动画的“正在加载数据...”消息。当 Web 服务返回数据并且数据正在加载到可观察的集合中时 - 动画会冻结(这可能会在数据加载时持续几秒钟,并给人一种可能有问题的印象。)

数据绑定到视图中项目控件的可观察集合。

我假设正在发生的事情是当数据被添加到可观察集合时,正在为数据绑定控件构建可视化树 - 这发生在 UI 线程上。

无论如何,我是否可以降低数据加载的优先级,以便 ui 线程上的动画可以继续 - 即使 UI 线程上正在完成大量数据工作?

谢谢迈克尔

4

4 回答 4

1

我不知道你是否得到了答案,但我走了。

尝试使用 BackgroudWorker 将重型指令放在那里。

这是一个很好的例子:http: //msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx

如果您有任何问题,请告诉我,或者如果您已经解决了这个问题,请告诉我。

于 2009-07-27T20:14:49.880 回答
0

我一直在使用具有不确定状态的进度控件,然后将其放在项目控件顶部具有半透明背景的控件中。我没有看到它在进行 Web 服务调用时停止动画,返回对象被处理为 ViewModel 并且 ItemControl 正在呈现更新的视图模型。

我认为您可以以非常简单的方式自定义进度条模板,也可以将 Loading Data... 消息添加为 TextBlock。我在进度控件上方也有一个正在加载...消息。

于 2009-06-30T21:31:05.233 回答
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 代码?

于 2009-07-02T14:35:40.443 回答
-1

您的动画没有运行,因为您的 JS 正在处理返回的数据。(单线程浏览器。)

解决方法:你的JS加载sw需要周期性的让浏览器让浏览器做一些动画。

请参阅我的 SO 答案为什么 jQuery Ajax 在 IE7 上这么慢?有关如何执行此操作的更多详细信息。

于 2009-06-30T03:45:37.900 回答