WPF OpenFileDialog 与 Win32 父窗口;窗口关闭时没有重新获得焦点

Posted

技术标签:

【中文标题】WPF OpenFileDialog 与 Win32 父窗口;窗口关闭时没有重新获得焦点【英文标题】:WPF OpenFileDialog with Win32 parent window; window is not regaining focus when closed 【发布时间】:2011-08-04 01:58:49 【问题描述】:

我有一个 c++ windows 应用程序调用一个 c++/cli 库,该库正在调用一个托管库。托管库正在调用 OpenFileDialog.Show 与 Win32 窗口拥有的 WPF 窗口父级。我还没有找到更好的方法来做到这一点,我在这里阅读并搜索 google 和 social.msdn 的所有资源都建议做我正在做的事情。

对话框打开得很好,但是当我点击取消按钮时,例如,应用程序完全失去焦点。我不确定它为什么会发生,但我似乎无法让它停止。我尝试了很多不同的方法都无济于事。

如果我只是启动 OpenFileDialog 而不创建 WPF 窗口,我看不到问题。 如果我不设置 WPF 窗口的所有者,我看不到问题。如果我调用 OpenFileDialog.Show 并且不传递父级,但仍然创建 WPF 窗口并设置其所有者,我仍然会看到问题。

我可以破解它以在它失去焦点后将父应用程序窗口设置为前台,但我不想这样做。

我已经为我的场景上传了一个小示例解决方案来说明问题:

http://dl.dropbox.com/u/26054523/MixedExample.zip

任何帮助将不胜感激。

【问题讨论】:

你试过在同一个线程上运行对话框吗? WinForms 和 Win32 都是单线程的。它可能不喜欢你从另一个线程打开对话框。 是的,我有,它不允许。在另一个线程中打开的原因是因为WPF似乎想在STA线程中运行。 我对 C# 也有类似的问题。出于某种原因,一旦 OpenFileDialog 被解除(通过 OK 或取消),程序就会失去焦点。 【参考方案1】:

您是否尝试过反转托管方案?现在听起来你要去非托管->桥->托管->WPF->Winforms。也许你可以去 ...managed->WinForms->WPF using ElementHost http://msdn.microsoft.com/en-us/library/ms742215.aspx

这样,WPF 窗口将只是 WinForms 应用程序的子控件,并且对于焦点切换可能会更好。 WinForms 控件并不是真的可以很好地直接与 WPF 应用程序一起工作,正如您所指出的,正在使用两种不同的 UI 线程设置。

【讨论】:

鉴于非托管代码库的大小和复杂性,这是一个重大变化。此外,实际上没有任何 WinForms。目标是非托管窗口仅调用托管 WPF。 很抱歉听到这个消息。在工作中,我们或多或少地直接在 WPF 中重新编码了打开文件对话框,以便与我们的窗口系统一起使用。没有更好的股票期权是一种痛苦,我认为这是 WPF 的普遍问题之一:股票对话框可能很棘手,除非您自己编写代码,然后它们需要大量工作。跨度> 【参考方案2】:

我知道这是一篇旧帖子,但我认为这是一个常见问题,我有一个很好的答案。如果你有一个名为 ParentWindow 的 Win32 窗口父窗口和一个名为 WPFChild 的 WPF 子窗口,你可以这样做:

using System.Windows.Interop;

void OpenWindow()

    WPFChildWindow WPFChild = new WPFChildWindow();
    WindowInteropHelper helper = new WindowInteropHelper(WPFChild)
    
        Owner = new NativeWindowWrapper(ParentWindow.Hwnd).Handle
    ;
    bool? ret = _stepsForm.ShowDialog();

这将导致子窗口保持在父窗口的顶部并用作对话框。请记住,WPF 窗口不返回 DialogResult,而是返回一个可为空的 bool。

NativeWindow 包装器是一个简单的类,它将一个 int 转换为一个 IntPtr。它实际上来自位于此处的 .net Excel 参考编辑项目:How to code a .NET RefEdit ControlT

【讨论】:

以上是关于WPF OpenFileDialog 与 Win32 父窗口;窗口关闭时没有重新获得焦点的主要内容,如果未能解决你的问题,请参考以下文章

OpenFileDialog 导致 WPF 应用程序崩溃

关于WPF中openfiledialog文件多选

wpf打开文夹和打开文件

OpenFileDialog 永久存储文件

OpenFileDialog 窗口未显示

WPF文件和文件夹的操作