我正在使用Ookii.Dialogs.Wpf.ProgressDialog(请参阅http://www.ookii.org/software/dialogs/用于二进制文件和源代码)来可视化某个进程。 它是一个BackgroundWorker和本地API调用Windows XP +集成ProgressDialog的组合。 我正在使用这样的对话框:
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 。 吉迪恩提到这个:
PROGDLG_MODAL应被视为中断,并避免使用。 […]
这篇文章从2008年开始,也是从2014年开始的新文章,它说这个function已经被打破了。 所以我的问题:有没有人遇到类似的问题,并有机会解决它? 还是我只是使用对话框错了? 有没有人build议如何解决这个问题,因为微软显然还没有解决任何问题。
在ShowDialog(this)
调用之后,您应该能够强制窗口返回激活状态。
this.worker.ShowDialog(this); this.Activate();
http://msdn.microsoft.com/en-us/library/system.windows.window.activate(v=vs.110).aspx