您无法从后台工作人员访问 UI 控件。您通常所做的是在调用 BackgroundWorker.RunWorkerAync() 之前将 IsBusy 设置为 true,然后在 BackgroundWorker.RunWorkerCompleted 事件处理程序中将 IsBusy 设置为 false。类似于:
Backgroundworker worker = new BackgroundWorker();
worker.DoWork += ...
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
IsBusy = false;
};
IsBusy = true;
worker.RunWorkerAsync();
您可以在 DoWork 事件处理程序中使用 Dispatcher 将项目添加到 ObservableCollection。
编辑:这是完整的解决方案
private void Button_Click(object sender, RoutedEventArgs e)
{
//on UI thread
ObservableCollection<string> collection;
ThreadStart start = delegate()
{
List<string> items = new List<string>();
for (int i = 0; i < 5000000; i++)
{
items.Add(String.Format("Item {0}", i));
}
System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
{
//propogate items to UI
collection = new ObservableCollection<string>(items);
//hide indicator
_indicator.IsBusy = false;
}));
};
//show indicator before calling start
_indicator.IsBusy = true;
new Thread(start).Start();
}