混合使用MFC和WPF:模态对话框

3
我正在将 C# WPF 对话框添加到现有的 C++ MFC 应用程序中,使用 C++/CLI 接口层。我已经让它们正常工作,但是我在模态方面遇到了问题。例如:
  1. MFC 应用程序使用 ShowDialog 显示 WPF 对话框,按预期工作。
  2. 该 WPF 对话框使用 DoModal 显示 MFC 对话框。WPF 对话框隐藏在基本的 C++ 应用程序后面,并且除非我手动更改 IsEnabled,否则不会被禁用。虽然不理想,但它能够工作。
  3. 现在,该 MFC 对话框已关闭。但由于 WPF 对话框尚未关闭,所以基本的 MFC 应用程序却恢复了启用状态。这很糟糕,因为它允许用户在 WPF 对话框仍然打开时执行一些奇怪的操作。
我感觉如果我能正确设置父对话框,那么它可能会更好地工作。但到目前为止,我还没有能够将 MFC 对话框的父级设置为 WPF 对话框,反之亦然。而且,我甚至不知道是否可以解决这个问题。
有什么想法吗?
2个回答

4
打开CDialog的诀窍是使用WindowsInteropHelper获取父WPF对话框的HWND。然后,您可以使用CWnd :: Attach将该HWND包装在CWnd类中,以传递给CDialog的构造函数。
我的问题是我已经构建了CDialog,但尚未显示。各种版本的SetParent只能用于目标子窗口已经具有有效句柄的情况。我不得不在我的CDialog类中编写一个新函数来设置m_wndParent,这就是它在最终创建对话框时使用的父项。然后一切都很好!
以某种方式从MFC对话框创建WPF对话框“只是起作用”。这是魔法。

2
显示WPF对话框时,您是否使用HwndSource类来包装WPF窗口?如果是这样,您可以::SetParent WPF窗口并使用HwndSource.Handle属性设置子孙的父级。

不需要使用HwndSource,除非我想在MFC/Win32窗口中嵌入WPF控件。不过也许值得一试...我会添加一个编辑关于我尝试过的内容。 - Joe
实际上,你可能已经接近了答案。我关注了HwndSouce部分,错过了::SetParent。我试图使用CDialog::SetParent,它需要一个CWnd指针,而CWnd::Attach对我来说不起作用。但是我应该能够使用WindowInteropHelper获取WPF侧的HWND,然后只需使用::SetParent即可。 - Joe
当300个字符限制。我稍后会测试这个 - 可能是在周一的工作中。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接