【问题标题】:WindowsFormsHost is always the most top from WPF elementWindowsFormsHost 始终是 WPF 元素中最顶层的
【发布时间】:2012-03-29 06:55:52
【问题描述】:

如何设置 z-index windowsformhost 不总是在 WPF 元素的顶部?

【问题讨论】:

  • 简单的答案:你不能。见here
  • 是否已经有新的解决方案如何解决这个问题?

标签: wpf z-index windowsformshost topmost


【解决方案1】:

根据 MSDN (Layout Considerations for the WindowsFormsHost Element)

托管的 Windows 窗体控件在单独的 HWND 中绘制,因此它是 始终绘制在 WPF 元素之上。

这是设计限制

另一篇来自 MSDN 的好文章解释了在 Windows 中使用不同图形技术时可能出现的问题,Technology Regions Overview

但是我在谷歌上搜索发现似乎有一些黑客行为(称为空域限制)

一个 hack(从未亲自尝试过,所以不确定它是否有效)在 this link

【解决方案2】:

我也遇到了同样的问题。

有一个潜在的解决方法 - 取决于 Windows 主机窗口控件的性质和您想要显示的 WPF 元素:

我将WindowsFormsHost 控件的Visibility 绑定到我的视图模型上的一个属性,以使我能够在我想要显示我们想要出现在它上面的WPF 时隐藏主机(及其上的控件)。

【讨论】:

    【解决方案3】:

    几年后更新(2016-09):

    正如顶部评论所指出的,我的以下回答不再有效,并且在 .NET 4.5 的最终版本或后续版本中不可用。不幸的是,我包含的链接仍然包含针对 .NET 的“当前版本”的 HwndHosts 的 z 排序信息,这可能会让一些人相信这个功能确实存在。它没有。没有变通方法。

    原答案:

    一年后,.NET 4.5 发生了一些变化。对于那些偶然发现这一点的人,就像我一样,这里是 MSDN 上Walkthrough: Arranging Windows Forms Controls in WPF 的更新摘录:

    默认情况下,可见的 WindowsFormsHost 元素始终绘制在其他 WPF 元素之上,并且不受 z-order 的影响。 要启用 z 排序,请将 WindowsFormsHost 的 IsRedirected 属性设置为 true,并将 CompositionMode 属性设置为 Full 或 OutputOnly。

    在使用 .NET 4.5 时,您只需将以下属性添加到您的 WindowsFormsHost 元素 IsRedirected="True"CompositionMode="Full" CompositionMode="OutputOnly"

    【讨论】:

    • 今天检查了 - 这些属性仅在 .net 4.5 的 beta 版本中。不幸的是,他们没有正常发布。
    • 1.3.10 Windows Presentation Foundation (WPF) 1.3.10.1 HwndHost 功能已从 .NET Framework 4.5 Beta 中的 WPF 中删除 .NET Framework 4.5 开发人员预览版包含 WPF HwndHost 重定向功能。但是,此功能有几个已知问题,已从 .NET Framework 4.5 Beta 中删除。它不会包含在任何未来的版本中。要解决此问题:没有可用的解决方法。
    • 如何在 .NET 4 中使用它?有可能吗?
    【解决方案4】:

    在我的情况下,我的 WindowsFormsHost 位于两行网格中。底行有一个 StackPanel,它会根据它包含的内容更改高度。我处理 StackPanel 的 LayoutUpdated 事件,通过从 Grid 的 ActualHeight 中减去它的 ActualHeight 来调整我的 WindowsFormsHost 的大小。请务必使用 ActualHeight 而不是 Height。

         void ResizeWinhost()
        {
            mainGrid.UpdateLayout();
            detailPanel.UpdateLayout();
            winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多