如何将Win32窗口设置为WPF窗口的所有者?

17

我想在一个传统的win32应用程序中使用WPF窗口。

我希望以类似的方式对待它们,例如WPF窗口始终显示在win32窗口之上。

为此,我想将WPF窗口的所有者设置为win32窗口,但我不知道如何实现。

这里提供解答代码:

System::Windows::Interop::WindowInteropHelper^ helper = gcnew System::Windows::Interop::WindowInteropHelper(myWpfChildWindow);
helper->Owner = (System::IntPtr)myMainWindowHWND;
2个回答

14
本文介绍如何获取两者的句柄以及如何使WPF窗口成为win32窗口的透明覆盖层。

http://dedjo.blogspot.com/2007/04/transparent-wpf-control-over-unmanaged.html

这篇文章使用WindowInteropHelper来实现类似的功能。

http://blogs.msdn.com/wpfsdk/archive/2007/04/03/centering-wpf-windows-with-wpf-and-non-wpf-owner-windows.aspx

关于WindowInteropHelper的MSDN页面:

http://msdn.microsoft.com/en-us/library/system.windows.interop.windowinterophelper.aspx

希望有所帮助,Ed。

1
是的,第二篇文章解决了问题,简单来说就是以下几行代码: System::Windows::Interop::WindowInteropHelper^ helper = gcnew System::Windows::Interop::WindowInteropHelper(myWpfChildWindow); helper->Owner = (System::IntPtr)myMainWindowHWND; - Sam
这在.NET 4上可以工作,但在.NET 3.5上不行。在.NET 3.5上,更改WindowInteropHelper的Owner属性没有效果。有人知道为什么吗?是否有解决方法? - Udi Bar-On
2
找到原因了:在.NET 3.5中,在窗口的事件处理程序中设置Owner太晚了。您必须在创建窗口的代码中,在构造之后立即设置它。.NET 4.0似乎更宽容,允许您从OnSourceInitialized()中设置窗口的所有者。 - Udi Bar-On

1

那么 SetParent() 呢?我知道当将 WPF 窗口作为 Windows Form 的 MDI 子窗口时,它是有效的。


3
我的 WPF 窗口没有 SetParent() 函数。 - Sam
SetParent是一个Win32函数,您可以与interop一起使用... [DllImport("User32")] - The Muffin Man

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