如何设置z-index windowsformhost,它们并不总是位于WPF元素的顶部?
如何设置z-index windowsformhost,它们并不总是位于WPF元素的顶部?
根据MSDN (WindowsFormsHost元素的布局注意事项)
托管的Windows窗体控件是在单独的HWND中绘制的,所以它是 总是在WPF元素之上绘制。
这是一个设计限制
来自MSDN的另一篇好文章解释了在Windows中使用不同图形技术时可能出现的问题 技术区域概述
然而谷歌搜索我发现似乎有一些hackings(称为空域限制)
一个黑客(从未亲自尝试过,所以不确定它是否有效)是 这个链接
更新,几年后(2016-09):
正如最高评论所述,我的以下答案不再有效,并且在最终版本的.NET 4.5或后续版本中不可用。不幸的是,我所包含的链接仍然具有针对.NET的“当前版本”的HwndHosts的z排序信息,这可能导致一些人相信这个功能确实存在。它没有。没有解决方法。
原始答案:
一年后,.NET 4.5的情况发生了一些变化。对于那些偶然发现这一点的人,就像我一样,这里有一个更新的摘录 演练:在WPF中安排Windows窗体控件 在MSDN上:
默认情况下,可见的WindowsFormsHost元素始终在其他WPF元素之上绘制,并且它们不受z顺序的影响。 要启用z排序,请将WindowsFormsHost的IsRedirected属性设置为true,将CompositionMode属性设置为Full或OutputOnly。
使用.NET 4.5时,您需要做的就是将以下属性添加到WindowsFormsHost元素中 IsRedirected="True"
和 CompositionMode="Full"
要么 CompositionMode="OutputOnly"
。
我刚遇到同样的问题。
有一种潜在的解决方法 - 取决于Windows Host窗口控件的性质和您想要显示的WPF元素:
我绑了 WindowsFormsHost
控制的 Visibility
到我的视图模型上的属性,以便我能够显示我们想要在其上显示的WPF时隐藏主机(及其上的控件)。
在我的情况下,我的WindowsFormsHost是一个双行Grid。底行有一个StackPanel,根据它包含的内容改变高度。我处理StackPanel的LayoutUpdated事件,通过从Grid的ActualHeight中减去它的ActualHeight来调整我的WindowsFormsHost。一定要使用ActualHeight而不是Height。
void ResizeWinhost()
{
mainGrid.UpdateLayout();
detailPanel.UpdateLayout();
winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
}