2011-01-13 51 views
0

我正在写一个Silverlight应用程序,我试图改善加载时间。有一个ObservableCollection更新用户界面元素得到添加

当我的页面加载,我先初始化我的ObservableCollection:

 this.MyItems = new ObservableCollection<Item>(); 

我的UI是我通过代码绑定到一个ObservableCollection一个列表框。在MainPage_Loaded中:

 MyList.ItemsSource = App.ViewModel.MyItems; 

现在我将UI绑定到我的模型。我期望这是有效的,因为集合是空的,并且其余的UI可以继续加载(不确定我的假设是否正确)。

 DataContext = App.ViewModel; 

现在我想将项目添加到我的收藏:

 for (int i = 0; i < number_of_items; i++) 
     { 
      this.MyItems.Add(myItems[i]); // myItems is a List<Item> already populated 
      Thread.Sleep(20); 
     } 

我的目标是让线程睡眠,以便它有时间来呈现每个列表框项目的用户界面。另外,我预计我的用户界面一次只能显示一个项目。

结果是ListBox元素一次出现。如果我设置1秒钟的睡眠时间,则1秒钟后元素数量将填充ListBox。

优化此操作的好方法是什么?如果它是徒劳的,我也可以将我的ListBox绑定到完全填充的ObservableCollection。谢谢!

+0

你使用VirtualizingStackPanel吗? – onmyway133 2012-12-09 08:47:35

回答

4

尝试将循环移至后台线程。这是一种方法。

Phạm Tiểu Giao - Threads in WP7

注意你需要派遣UI更新。如果你想使用一个固定的时间段像

Dispatcher.BeginInvoke(() => { this.MyItems.Add(myItems[i]); }); 

睡眠的东西会工作。只要确保时间长度为总是比更新显示所花费的时间更长,否则您可能会用更快的速度重载UI线程,使其更新速度超过其可以处理的时间。

+0

谢谢,这正是我想要的:) – siger 2011-01-13 07:59:20

+0

yw :) ../15char – 2011-01-13 08:03:58

2

我们绑定到ObservableCollection的原因是内置通知通过INotifyPropertyChanged接口实现发生属性更新。这会导致在对基础集合的每次更新中触发事件,这会导致重新绘制相关的UI元素(在这种情况下为ListBox)。数据模板在每次重绘时应用于集合中的每个项目,并通过数据绑定自动完成。这些项目将以比平局更快的速度(在一个单独的线程中)添加到您的收藏中,因此,为什么看起来您的负载会延迟到所有项目被添加为止。由于在添加新项目时屏幕上绘制和失效,因此您在屏幕上直观地忽略重绘周期。

这意味着您的Thread.Sleep调用只会延迟添加的每个项目上的元素的完全重绘(*添加的项目数量解释了为什么您的UI将完全重绘在每个项目上,但仅限于全部已经进行了相应的Thread.Sleep调用,它阻止了用于n * sleepValue时间的UI线程)。这就是为什么我们需要使用如上所述的Dispatcher对象,因为这些调用是在不同的线程上进行的。这使我们可以从UI线程重新绘制,这本质上是同步阻塞调用。

我绝对不会在这里使用Dispatcher,因为它是多余的,并且防止发生本地同步,因为调度程序可能引用尚未创建并添加到可视树或逻辑树的元素(正如您的评论将设置为1000ms与20ms之间的值)。您将仍然重新绘制集合中的所有项目,因为每个项目都会添加,从而导致您的睡眠呼叫无效或无法使用,因为缺乏更好的术语。

作为一种替代解决方案,我提供的是,您可以在数据模板的根元素的“不透明度”属性中添加故事板动画,以便创建项目的视觉效果,从而“一次添加一个项目”。 “这样,当每个项目被添加到底层集合中时,它们将用不透明度淡化动画来绘制,从而给出幻觉,每个项目被单独添加一个(并且动画到视图中)并且具有单独的动画(在不同的偏移处定义的动画)。我相信这会给你你想要的效果。但由于绘图调用来自ListBox,因为它维护着它的项目集合,所以每个.Add调用ViewModel项目的ObservableCollection对象将会使整个集合失效。实际上没有办法来覆盖这种行为,因为它发生在层次结构的上游一层。我会建议反对提供的方法。

相关问题