我使用ookii.dialogs.wpf.progressdialog(有关二进制文件和源代码,请参见http://www.ookii.org/software/dialogs/)来可视化某个进程。它是对windows xp+集成progressdialog的backgroundworker和本机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
是wpfWindow
)。相反,它会聚焦当前打开的随机窗口。在检查了ookii.dialogs代码之后,我发现正在使用本机windows api调用IOperationsProgressDialog::StartProgressDialog
。api调用在ookii中这样包装。对话框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_model应视为已损坏,并避免使用。[…]
这篇2008年的文章和2014年的新文章都说这个功能已经坏了。所以我的问题是:有没有人遇到过类似的问题并有机会解决?或者我只是用错了对话?有人建议我如何解决这个问题,因为微软显然还没有解决任何问题。
最佳答案
您应该能够在调用ShowDialog(this)
之后强制窗口恢复活动状态。
this.worker.ShowDialog(this);
this.Activate();
http://msdn.microsoft.com/en-us/library/system.windows.window.activate(v=vs.110).aspx
关于c# - Ookii.Dialogs模式对话框中的ProgressDialog在完成后不聚焦所有者窗口,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21920645/