我在上图中显示了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的新手,不知何故觉得我已经搞砸了。
答案 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
。
你可以提出更多疑问,我会在这里更新。