如何通过异步方法打开WPF窗口

时间:2018-11-25 07:08:08

标签: c# wpf asynchronous progress-bar showdialog

我一直在努力寻找解决方案,但是到目前为止,我发现没有任何东西引起点击。我从WPF开始,所以我可能错过了一些显而易见的答案,但是对于愚蠢的答案,我将不胜感激。这是这种情况:

我的应用是使用MVVM构建的。它的主要功能是通过按钮调用的。一旦被调用,它将遍历指定目录中的所有文件并执行一些重命名。在执行此循环时,我想显示一个进度条,指示总共重命名了多少个文件。 进度值是绑定到 Progressbar 控件

的属性

我只能异步更新进度条;否则它将保持为空,直到该过程完成。现在,它与 BackgroundWorker 一起工作。

<input type="button" id="A1" class="A" value="1" onclick="clicked()">

为执行重命名,文件名中应包含一个哈希。如果找到该哈希,它将被转换为用户输入的值,否则应显示一个窗口,要求用户输入它。

该窗口无法显示在 MTAThread 中(我正在使用 ShowDialog ,我没有找到其他使其显示的方法),因此我无法从主窗口中的async方法调用它。我发现使其生效的唯一方法是像这样调用 RenamingMethod 中的所有内容:

_bgWorker.DoWork += (s, e) =>
{
    RenamingMethod();
};
...
RenamingMethodCommand = new RelayCommand(_ =>_bgWorker.RunWorkerAsync());

这时,进度栏仅在我关闭弹出窗口时更新。然后它将保持相同的值,直到打开和关闭新窗口。

我想从更新进度条的异步方法中打开弹出窗口,因此它的演变是平稳的,当打开新窗口时它停止了。或者能够同步更新进度条也可能会起作用。

这是更详细的代码:

public void RenamingMethod()
{
    Application.Current.Dispatcher.Invoke((Action)delegate
    {
        //code for renaming
    }
}

1 个答案:

答案 0 :(得分:0)

Invoke调用将切换到GUI线程,因此您基本上是在完成所有工作并实际上消除了使用辅助线程的全部要点。更改RenameMethod(),以使Invoke块中唯一的东西实际上是实际需要在其中的东西,即更新进度条的行。

更好的是,开始为GUI控件使用正确的数据绑定,以使您完全不必搞乱任务切换。