使用WPF窗口作为父窗口的Winform对话框

14

我有一个WinForm对话框,想要将其Parent属性设置为一个WPF窗口。如何操作?

1个回答

8
考虑传递参数给ShowDialog方法,而不是使用Parent属性。您可以编写辅助类。
class Wpf32Window : IWin32Window
{
  public IntPtr Handle { get; private set; }

  public Wpf32Window(Window wpfWindow)
  {
    Handle = new WindowInteropHelper(wpfWindow).Handle;
  }
}

public static class WindowExtensions
{
  public static IWin32Window GetWin32Window (this Window parent)
  {
    return new Wpf32Window(parent);
  }
}

之后,您只需编写以下内容:

winFormsWindow.Show(yourWpfWindow.GetWin32Window());

创建的对象的 Handle 属性为空。您知道为什么吗? - Miklós Balogh
你的WPF窗口已经创建好了吗?当窗口已经加载时,尝试使用这段代码。在我的情况下,我没有遇到这个问题。也许这篇文章会有所帮助:http://social.msdn.microsoft.com/Forums/ar/wpf/thread/5f89ac58-d2ef-4ac0-aefb-b2826dbef48a - nevermind
这似乎无法正常工作 - new Wpf32Window 从未被释放,即使程序结束后,原始进程仍然存在,因为该新窗口从未被正确地释放。 - Conrad
需要的是: Form winFormsWindow = new Form(); IWin32Window win32WinVer = yourWpfWindow.GetWin32Window(); winFormsWindow.Show(win32WinVer); ((Window)win32WinVer).Close(); 而不是以上的调用。 - Conrad
当调用((Window)win32WinVer).Close()时,我会收到System.InvalidCastException。 - MTR
无法将GetWin32Window的结果转换为System.Windows.Window。您不需要关闭从WindowInteropHelper获取的句柄(请参见http://stackoverflow.com/questions/15312883/windowinterophelper-handle-do-i-need-to-release-it)。您可以使用`yourWpfWindow.Close()`关闭WPF窗口。但是,当您希望它成为新对话框的父级时(可能希望在应用程序退出时关闭子级),我不认为这样做有意义。或者,如果您可以使用模态对话框(`ShowDialog()`而不是`Show`),这将确保主WPF窗口在“子”Winform对话框之后关闭。 - nevermind

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