如何在WPF中逐个加载UI控件

如何在WPF中逐个加载UI控件,wpf,user-interface,wpf-controls,doevents,Wpf,User Interface,Wpf Controls,Doevents,我正在开发一个WPF应用程序,其中有多个列表视图 我一次获得所有列表视图所需的所有数据。但是,我的要求是,在开始加载下一个列表视图之前,应该首先加载项目数较少的列表视图,并将其显示给用户 因此,基本上,我需要首先加载ListView1并使其对用户可见。然后开始加载ListView2,当用户看到complete时。换句话说,当页面一个接一个地加载时,所有列表视图都会加载,并且每个视图在加载后都会显示出来 我尝试使用与DoEvents()相当的东西 但它没有起作用 只是澄清一下; 当页面被加载,lv

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

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

因此,基本上,我需要首先加载ListView1并使其对用户可见。然后开始加载ListView2,当用户看到complete时。换句话说,当页面一个接一个地加载时,所有列表视图都会加载,并且每个视图在加载后都会显示出来

我尝试使用与DoEvents()相当的东西 但它没有起作用

只是澄清一下; 当页面被加载,lv1的项目被填充,lv1显示项目,但是lv2和lv3将为空。然后加载lv2的项目,我们应该看到lv1和lv2填充了它们的项目。此时,lv3应该可见且为空。然后,我们将获得lv3的项目,并填充所有列表视图。在第一个项目加载后,所有这些项目都应该立即可见。 有人能提出实现这一目标的方法吗


谢谢。

我会使用后台线程,或
调度程序
按顺序加载列表框

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

下面是一个粗略的例子:

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

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


还为正在加载的listview使用了BusyIndicator(WPFToolKitExtended)。

您能说明一下如何实现它吗?是否希望所有列表视图都可见,但有些视图为空?或者你想让这些视图一个接一个地可见?我更愿意让所有列表视图都可见,并逐个填充它们。但是,第二个选项也可以。如果您使用
可见性=隐藏
加载所有列表视图,这是可能的,因为它们都将在短时间内加载,然后使用
关键帧
动画触发所有基于previou元素
可见性
的元素的
可见性
可见
。嘿,尼哈尔,看看这个,他为DelayBinding做了一个实现。也许你可以调整一下,让它可以在一段时间后绑定到你的其他列表。这将确保您不必管理视图端和视图模型端之间的状态,也不需要嵌套消息泵(我认为这会使代码有点复杂),谢谢。这种方法对我很有效,因为在加载listbox2时,我可以看到listbox1中的项目。不过,最好是在加载第二个列表框1时,我可以从列表框1中选择一个项目(以任何方式使用,从中触发事件)。需要将UI内容和获取数据内容分开,以便backgroundworker不会插手UI。