WPF在后台同时使用冻结UI加载多个选项卡

时间:2016-10-01 06:34:29

标签: wpf vb.net multithreading tabcontrol tabitem

Basic UI

我在上图中显示了UI。

每个标签都有一些控件,比如网格,其中有一些数据来自数据表。

我想要什么? 当我们打开新标签时,就像网络浏览器一样,它会在后台加载。 整个浏览器不会冻结。如果在另一个标签中加载推特,你就能看到并与facebook互动。

目前的表现如何?

当我点击左侧树视图中的一个项目时,标签会被打开,但它冻结应用程序的整个UI,我无法点击另一个树视图项目,直到标签已将其数据完成到网格中。 / p>

当前实施

在treeview click事件上,创建另一个调用addTab()的线程 功能

yaml_set_comment_before_key()

下面的函数创建backgroundWorker线程对象bw, bg_dowork()从DB获取数据表以在tabitem中绑定到网格。 bg_RunWorkerCompleted()将该dt绑定到tabitem中的网格。

treeviewlist_SelectedItemChanged()
{
   Dim thread As New Thread(Sub() Me.AddTab( itemno))
   thread.Start()
 }

说实话,我是WPF和vb.net的新手,不知何故觉得我已经搞砸了。

1 个答案:

答案 0 :(得分:0)

这是c#代码。但它很好地解释了这个概念。它使用async / await关键字。下面的for循环可以替换为您的数据访问代码。

ViewModel vm = new ViewModel();
...    
private async void Button_Click(object sender, RoutedEventArgs e)
{
    await _loadEmployees();
}

private Task _loadEmployees()
{
    Task t = Task.Factory.StartNew(() =>
    {
        var employees = new ObservableCollection<Employee>();

        for (long i = 0; i < 999999; ++i)
            employees.Add(new Employee() { Name = "Name" + i, Address = DateTime.Now.ToString() });

        vm.Employees = employees;
    });

    return t;
}

DataGrid绑定到Employees的{​​{1}}属性。

设置ViewModel的{​​{1}}和Width,以便Height可以使用DataGrid

你可以提出更多疑问,我会在这里更新。