如何在WPF中一个接一个地加载UI控件

时间:2011-10-10 08:19:54

标签: wpf user-interface wpf-controls doevents

我正在开发一个WPF应用程序,其中有多个列表视图。

我立刻获得了所有列表视图所需的所有数据。但是,我的要求是,在下一个列表视图开始加载之前,应首先加载具有较少项目的列表视图并显示给用户。

基本上,我需要首先加载ListView1并使其对用户可见。然后ListView2开始加载,并在完成后对用户可见。换句话说,当页面一个一个地加载时加载所有列表视图,并且每个列表视图在加载后立即可见。

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

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

感谢。

2 个答案:

答案 0 :(得分:0)

我会使用后台线程,或Dispatcher按顺序加载ListBox。

因此,您可以立即获取所有数据,检查哪个数据应首先加载,然后在另一个线程上启动。当该过程完成时,启动下一个过程。当第二个完成时,加载第三个。

这是一个粗略的例子:

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;
        }
    }
}

答案 1 :(得分:0)

我使用backgroundworker获取第一个listview的数据。 在完成后台工作时,我填充了第一个ListView。然后使用backgroundworker再次获取第二个listview的数据,并在onComplete中填充第二个列表视图,依此类推。

还将BusyIndi​​cator(WPFToolKitExtended)用于正在加载的列表视图。