12

如何设置 z-index windowsformhost 它们并不总是位于 WPF 元素的顶部?

4

4 回答 4

13

根据 MSDN (WindowsFormsHost 元素的布局注意事项)

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

这是设计限制

MSDN 的另一篇好文章解释了在 Windows 中使用不同的图形技术时可能出现的问题是技术区域概述

然而谷歌搜索我发现这似乎有一些黑客行为(称为空域限制)

一个黑客(从未亲自尝试过,所以不确定它是否有效)位于 此链接

于 2012-03-29T09:10:07.607 回答
4

我刚刚遇到了同样的问题。

有一个潜在的解决方法 - 取决于 Windows 主机窗口控件的性质和您希望出现的 WPF 元素:

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

于 2016-06-02T14:52:27.117 回答
2

更新,几年后(2016-09):

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

原答案:

一年后,.NET 4.5 发生了一些变化。对于那些偶然发现这一点的人,就像我一样,这里是演练的更新摘录:在 MSDN 上的 WPF 中安排 Windows 窗体控件:

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

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

于 2013-04-08T21:29:18.427 回答
0

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

     void ResizeWinhost()
    {
        mainGrid.UpdateLayout();
        detailPanel.UpdateLayout();
        winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
    }
于 2016-08-18T21:09:51.420 回答