我正在使用C++/CLI接口层将C#WPF对话框添加到现有的C++MFC应用程序中。除了我在模态方面有问题之外,我已经把事情做好了。例如:
- MFC应用程序使用ShowDialog显示WPF对话框。工作符合预期
- 该WPF对话框显示了使用DoModal的MFC对话框。WPF对话框隐藏在基本C++应用程序后面,除非我手动更改IsEnabled,否则不会被禁用。不理想,但它是有效的
- 现在,MFC对话框已关闭。现在,由于某种原因,基本MFC应用程序被启用,而由于WPF对话框尚未关闭,它仍然应该被禁用。这很糟糕,因为它现在允许用户在WPF对话框仍然打开的情况下做一些疯狂的事情
我有一种感觉,如果我能正确设置家长对话框,效果会更好。但到目前为止,我还无法将MFC对话框的父级设置为WPF对话框,反之亦然。而且,我甚至不知道这是否能解决问题。
有什么想法吗?
打开CDialog时,诀窍是使用WindowsInteropHelper获取父WPF对话框的HWND。然后,可以使用CWnd::Attach将HWND封装在CWnd类中,以传递给CDialog的构造函数。
我遇到的问题是我已经构建了CDialog。,但尚未显示。只有当目标子窗口已经具有有效句柄时,才能使用SetParent的各种版本。我不得不在CDialog类中编写一个新函数来设置m_wndPParent,它在最终创建对话框时将其用作父函数。然后一切都很好!
不知怎的,从MFC对话框创建WPF对话框"刚刚好用"。这很神奇。
显示WPF对话框时,是否使用HwndSource类包装WPF窗口?如果是这样,您可以::SetParent WPF窗口以及使用HwndSource。Handle属性来设置子级的父级。