2011-10-10 83 views
0

我正在处理有多个列表视图的WPF应用程序。如何在WPF中一个接一个地加载UI控件

我得到所有列表视图一次所需的所有数据。但是,我的要求是,列表视图中包含的项目数量应该先加载并在下一个列表视图开始加载之前先显示给用户。

所以基本上,我需要ListView1加载并首先让用户可见。然后,ListView2开始加载,并在完成时显示给用户。换句话说,所有的列表视图都是在页面加载9时加载的),并且每个列表视图在加载后立即可见。

我尝试使用相当于DoEvents()的东西 http://www.cnblogs.com/sheva/archive/2006/08/24/485790.html 但它没有奏效。

只是为了澄清; 当页面被加载并且lv1的项目被填充并且lv1与项目一起被显示时,但是lv2和lv3将是EMPTY。然后加载lv2的物品,我们应该看到lv1和lv2填充其物品。此时lv3应该是可见的并且是空的。然后我们将获得lv3的项目,并且所有的列表视图都将被填充。所有这些应该在第一个装载物品后立即可见。 任何人都可以提出任何方式来实现这一目标?

谢谢。

+0

你能澄清你想如何实现它吗?你想要所有的列表视图可见,但有些是空的吗?或者你想让它们一个接一个地看到? – whoisthis

+0

我希望保持所有列表视图可见,并逐个填充它们。但是,第二种选择也是可以的。 –

+0

如果你使用'Visibility = Hidden'加载所有的ListViews,因为它们全部都会立即加载,然后使用'KeyFrame'动画为所有这些元素触发'Visibility'到'Visible',而不是基于元素的'可见性'一个接一个。 –

回答

0

我会使用后台线程或Dispatcher按顺序加载您的ListBoxes。

因此,您将一次获得所有数据,检查哪一个应先载入,然后在另一个线程上启动。当该过程结束时,启动下一个。当第二个完成时,加载第三个。

这里有一个粗略的例子:

var list1 = new int { 1, 2, 3, 4 }; 
var list2 = new int { 5, 6, 7 }; 
var list3 = new int { 8, 9 }; 

// Optionally do whatever checks needed to figure out which 
// list should load first 

this.Dispatcher.BeginInvoke(DispatcherPriority.Background, 
new Action(delegate() 
{ 
    MyListBox1.ItemsSource = list1; 

    this.Dispatcher.BeginInvoke(DispatcherPriority.Background, 
    new Action(delegate() 
    { 
     MyListBox2.ItemsSource = list2; 

     this.Dispatcher.BeginInvoke(DispatcherPriority.Background, 
     new Action(delegate() 
     { 
      MyListBox3.ItemsSource = list3; 
     } 
    } 
} 
+0

谢谢。这种方法适用于我,因为我可以在listbox2加载时看到listbox1中的项目。然而,我可以更好地选择一个项目(以任何方式通过激发来自listbox1的事件),当第二个被加载时。 –

0

我使用BackgroundWorker的获取数据的第一列表视图。 完成backgroundworker后,我填充了第一个ListView。然后再次使用backgroundworker获得第二个listview的数据,onComplete填充第二个列表视图等。

还使用BusyIndi​​cator(WPFToolKitExtended)作为正在加载的列表视图。

+0

需要保持UI的东西,并获取数据的东西分开,以便后台工作人员不会在UI上得到一个手。 –

相关问题