我正在使用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年的新帖子,它说这个功能已被打破。所以我的问题:有没有人遇到过类似的问题而且有机会修复它?或者我只是使用对话框错了?有没有人建议我如何解决这个问题,因为微软显然还没有解决任何问题。
答案 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