2016-10-01 65 views
0

Basic UIWPF在冻结UI的背景下同时加载多个选项卡

我在上图中显示了UI。

每个选项卡都有一些控件,如网格,其中有一些数据从数据表填充。

我想要什么? 行为就像网页浏览器,当我们打开新标签时,它会在后台加载。 整个浏览器不会冻结。如果twitter在另一个选项卡中加载,则您可以看到并与Facebook进行交互。

它目前的行为如何?

当我点击左侧treeview中的一个项目时,tab被打开,但它冻结了应用程序的整个UI,我无法点击另一个treeview项目,直到该选项卡已将其数据填充到网格中。

当前的树状点击事件实施

,另一个线程创建它调用addTab()函数 。

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

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

Addtab() 

{ 
    Thread.Sleep(TimeSpan.FromSeconds(2)) 
     Dispatcher.BeginInvoke(New Action(Function() 

    Dim bg As New BackgroundWorker 

     AddHandler bg.DoWork, Sub(sender, e) 
     //get dt 
     End Sub 

    AddHandler bg.RunWorkerCompleted, Sub(sender, e) 
    // bind dt to grid 
    End Sub 
    Return 1 
    End Function), DispatcherPriority.Send) 

} 

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

+0

为什么你创建一个线程时,你在该线程中做的唯一事情是调用一个方法? (在这种方法中,你是因为某种原因试图再次执行多线程??)当你调用Dispatcher。(开始)Invoke()'你正在将执行移动到UI线程。 - 你现在正在做的只是多余的!您只需创建一个新线程,以便在UI线程上执行代码,并在其中创建后台工作程序以再次执行多线程。你甚至从来没有开始BGW。您可以在线程中执行所有操作,并在需要访问UI时调用,或者从头开始使用BGW。 –

+0

_当你需要访问UI_ **时,要么在你的线程中执行所有操作,要么调用它是否可以动态创建整个选项卡项目,从数据库获取数据,将其绑定到线程中的网格并将选项卡项目附加到创建的选项卡控件在主线程上?** – ubergeek

+0

是的,如果您只需调用一次即可访问UI,那么您几乎可以做任何事情。 –

回答

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势必的ViewModelEmployees财产。

设置WidthHeightDataGrid以便DataGrid可以使用UIVirtualization

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