【问题标题】:How to set Win32 window as owner of WPF window?如何将 Win32 窗口设置为 WPF 窗口的所有者?
【发布时间】:2011-02-05 15:26:18
【问题描述】:

我想在旧版 win32 应用程序中使用 WPF 窗口。 我想以类似的方式表现它们,就像 WPF 窗口总是显示在 win32 窗口的顶部。

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

这里有什么帮助吗?

由于答案隐藏在某个链接后面,这里的代码可以解决问题:

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

【问题讨论】:

    标签: wpf winapi owner


    【解决方案1】:

    本文展示了如何获取两者的句柄以及如何使 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

    希望对您有所帮助, 埃德

    【讨论】:

    • 是的,第二篇文章成功了,简而言之,以下几行: System::Windows::Interop::WindowInteropHelper^ helper = gcnew System::Windows::Interop::WindowInteropHelper(myWpfChildWindow) ; helper->Owner = (System::IntPtr)myMainWindowHWND;
    • 这适用于 .NET 4 但不适用于 .NET 3.5。在 .NET 3.5 上,更改 WindowInteropHelper 的 Owner 属性无效。有人知道原因和解决方法吗?
    • 找出原因:在 .NET 3.5 中,在窗口的事件处理程序中设置 Owner 为时已晚。您必须在构建后立即在创建窗口的代码中设置它。 .NET 4.0 似乎更宽松,允许您从 OnSourceInitialized() 中设置窗口的所有者。
    【解决方案2】:

    SetParent() 怎么样?我知道使 WPF 窗口成为 Windows 窗体的 MDI 子窗口时有效。

    【讨论】:

    • 我的 WPF 窗口没有 SetParent() 函数。
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 2014-10-12
    • 2016-06-10
    相关资源
    最近更新 更多