我使用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/

10-10 22:53