工作线程没有更新按钮的可见性状态
本文关键字:可见性 状态 按钮 更新 线程 工作 | 更新日期: 2023-09-27 18:03:20
我在wpf应用程序中的BackgroundWorker的帮助下进行批量复制操作。我像下面这样从工作线程
调用DoAction方法private void DoAction()
{
.....................
..................... // some code goes here and works fine
//Enable the Explore link to verify the package
BuildExplorer.Visibility = Visibility.Visible; // here enable the button to visible and gives error
}
如果我在最后看到BuildExplorer按钮可见性,它说错误"调用线程不能访问这个对象,因为一个不同的线程拥有它。"如何更新UI线程状态?
在WPF中,从UI线程修改UI是合法的。像改变可见性这样的操作是在修改UI,不能在后台工作器中完成。您需要在UI线程
中执行此操作。在WPF中最常用的方法是如下
- 在UI线程中捕获
Dispatcher.CurrentDispatcher
- 对从后台线程捕获的值调用
Invoke
来完成UI线程 上的工作
例如
class TheControl {
Dispatcher _dispatcher = Dispatcher.CurrentDispatcher;
private void DoAction() {
_dispatcher.Invoke(() => {
//Enable the Explore link to verify the package
BuildExplorer.Visibility = Visibility.Visible;
});
}
}
如果您从不同的线程访问,请封送控制访问。在Windows和许多其他操作系统中,控件只能由它所在的线程访问。你不能在另一个线程中摆弄它。在WPF中,调度程序需要与UI线程关联,并且只能通过调度程序封送调用。
如果是长时间运行的任务,使用BackgroundWorker类来获得完成通知
var bc = new BackgroundWorker();
// showing only completed event handling , you need to handle other events also
bc.RunWorkerCompleted += delegate
{
_dispatcher.Invoke(() => {
//Enable the Explore link to verify the package
BuildExplorer.Visibility = Visibility.Visible;
};