0

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

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

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

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

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

谢谢。

4

2 回答 2

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;
        }
    }
}
于 2011-10-10T13:39:18.777 回答
0

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

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

于 2011-11-04T07:10:00.610 回答