模态样式的Ookii.Dialogs ProgressDialog在完成后不会关注所有者窗口

时间:2014-02-20 22:03:29

标签: c# wpf windows dialog

我正在使用Ookii.Dialogs.Wpf.ProgressDialog(请参阅http://www.ookii.org/software/dialogs/了解二进制文件和源代码)来可视化某个进程。它是BackgroundWorker和对Windows XP +集成ProgressDialog的本机API调用的组合。我正在使用这样的对话:

this.worker = new ProgressDialog {ShowTimeRemaining = true};
this.model.BackgroundWorker = this.worker;
this.worker.DoWork += (s, ev) => this.model.ExportAnalysis(saveFileName);
this.worker.ShowDialog(this);

任务完成后,模态对话框应重新聚焦所有者窗口(ShowDialog(this)this是WPF Window)。但相反,它集中了一个当前打开的随机窗口。在检查了Ookii.Dialogs代码之后,我发现正在使用本机Windows API调用IOperationsProgressDialog::StartProgressDialog。 API调用在Ookii.Dialogs C#源代码中包含这样:

[PreserveSig]
void StartProgressDialog(
    IntPtr hwndParent,
    [MarshalAs(UnmanagedType.IUnknown)]
    object punkEnableModless,
    ProgressDialogFlags dwFlags,
    IntPtr pvResevered
    );

经过一些研究后,我在这个网站上遇到了两篇帖子:http://msdn.microsoft.com/en-us/library/windows/desktop/bb775262%28v=vs.85%29.aspx。 Gideon7提到了这个:

  

[...] PROGDLG_MODAL应被视为已损坏并避免使用。 [...]

这篇文章来自2008年以及2014年的新帖子,它说这个功能已被打破。所以我的问题:有没有人遇到过类似的问题而且有机会修复它?或者我只是使用对话框错了?有没有人建议我如何解决这个问题,因为微软显然还没有解决任何问题。

1 个答案:

答案 0 :(得分:2)

您应该可以在ShowDialog(this)来电后强制窗口恢复活动状态。

this.worker.ShowDialog(this);
this.Activate();

http://msdn.microsoft.com/en-us/library/system.windows.window.activate(v=vs.110).aspx