如何设置 z-index windowsformhost 它们并不总是位于 WPF 元素的顶部?
4 回答
根据 MSDN (WindowsFormsHost 元素的布局注意事项)
托管的 Windows 窗体控件在单独的 HWND 中绘制,因此它始终绘制在 WPF 元素之上。
这是设计限制
MSDN 的另一篇好文章解释了在 Windows 中使用不同的图形技术时可能出现的问题是技术区域概述
然而谷歌搜索我发现这似乎有一些黑客行为(称为空域限制)
一个黑客(从未亲自尝试过,所以不确定它是否有效)位于 此链接
我刚刚遇到了同样的问题。
有一个潜在的解决方法 - 取决于 Windows 主机窗口控件的性质和您希望出现的 WPF 元素:
WindowsFormsHost
我将控件绑定Visibility
到我的视图模型上的一个属性,以使我能够在我想要显示我们想要出现在它上面的 WPF 时隐藏主机(及其上的控件)。
更新,几年后(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"
.
在我的情况下,我的 WindowsFormsHost 位于两行网格中。底行有一个 StackPanel,它会根据它包含的内容更改高度。我处理 StackPanel 的 LayoutUpdated 事件,通过从网格的 ActualHeight 中减去它的 ActualHeight 来调整我的 WindowsFormsHost 的大小。请务必使用实际高度而不是高度。
void ResizeWinhost()
{
mainGrid.UpdateLayout();
detailPanel.UpdateLayout();
winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
}