- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我已经搜索过论坛,但我认为没有一个问题适合我的问题......
我使用 BackgroundWorker 来处理一个非常耗时的操作。此操作完成后,应将按钮设置为启用,以便用户可以执行另一个操作。
我正在使用 WPF 并且遵循 MVVM 模式,因此我无法直接访问此按钮。我必须在 BackgroundWorker_RunWorkerCompleted 事件处理程序中调用一个方法,该方法将表示按钮启用状态的属性设置为 true。
除一件事外一切正常:按钮仅在我例如单击进入窗口(或最大化窗口,...)。这很烦人,我花了一整天时间才摆脱这种行为,但我找不到解决方案......
BackgroundWorker_RunWorkerCompleted 事件处理程序如下所示:
void fileLoadBackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
SetButtonToEnabled(); }
有人知道如何解决这个问题吗?
编辑:
按钮绑定(bind)了一个命令:
<Button Name="btnLoadTargetFile" Command="{Binding Path=LoadTargetCommand}" .../>
此命令是 Smith 在其博客 (http://msdn.microsoft.com/en-us/magazine/dd419663.aspx) 中所述的 RelayCommand,如下所示:
public RelayCommand LoadTargetCommand
{
get
{
if (loadTargetCommand == null)
{
loadTargetCommand = new RelayCommand(param => this.OnRequestLoadFile(BusinessLogic.CustomTypes.TreeType.Target), param => this.CanLoadTarget);
}
return loadTargetCommand;
}
set { loadTargetCommand = value; }
}
this.CanLoadTarget 由 SetButtonToEnabled() 设置为 true;方法
编辑 2:
以下代码“有效”:
fileLoadBackgroundWorker.RunWorkerAsync(argumentList);
while(fileLoadBackgroundWorker.IsBusy)
System.Windows.Forms.Application.DoEvents();
SetButtonToEnabled();
但这是某种非常危险和丑陋的代码......
最佳答案
虽然不能解释你的问题,你可以尝试添加
System.Windows.Forms.Application.DoEvents();
或
Dispatcher.Invoke(new Action(delegate { }), DispatcherPriority.Background);
到您的 SetButtonToEnabled 函数调用结束(在您将按钮 Enabled 设置为 true 之后)。看起来后台工作人员正在调用 Complete 事件,但 GUI 没有刷新。
Here是在 WPF 中使用 Backgroundworker 的完整示例。您可能想看看它并确保您的东西看起来一样。
你也可以看看 Asynchronous Threading with Background Worker Object .这是使用 Dispatcher 和 Backgroundworker 的一个很好的例子
WPF Threading Model是另一个值得检查的重要来源。
关于c# - 为什么 BackgroundWorker_RunWorkerCompleted 不更新 GUI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2006894/
假设有以下情况。表单有一个按钮,单击该按钮可启动后台工作程序。在 RunWorkerCompleted 事件处理程序中,有一段代码会抛出未经处理的异常。表单从 Application.Run 方法启动
我已经搜索过论坛,但我认为没有一个问题适合我的问题...... 我使用 BackgroundWorker 来处理一个非常耗时的操作。此操作完成后,应将按钮设置为启用,以便用户可以执行另一个操作。 我正
我是一名优秀的程序员,十分优秀!