如何设置的z-index windowsformhost,他们并不总是在WPF元素的顶部?
Answer 1:
根据MSDN (用于WindowsFormsHost元素布局的考虑)
托管的Windows窗体控件在一个单独的HWND绘制,所以它总是在WPF元素的上面绘制。
这是设计限制
从MSDN另外一个很好的文章,在Windows中使用不同的图形技术时解释了可能存在的问题是技术概述地区
不过google搜索,我发现,似乎有一些这方面的hackings(被称为空域限制)
一个黑客(从来没有尝试过亲自所以不知道如果它的工作原理)在此链接
Answer 2:
我刚刚遇到了同样的问题。
还有一个潜在的解决方法 - 这取决于Windows主机窗口控制,你希望出现在WPF元素的性质:
我约束了WindowsFormsHost
控制的Visibility
在我的视图模型的属性,使我能够隐藏主机(和其上的控件),当我想以显示我们希望出现在它的WPF。
Answer 3:
更新,几年后(2016-09):
我以下的答案,正如上面注释中提到,不再有效,并在.NET 4.5,或后续版本的最终版本是不可用。 不幸的是,我包括链接仍然有存在的.NET的“最新版本”,这可能导致一些人认为这个功能呢,其实HwndHosts Z排序信息,存在。 事实并非如此。 有没有变通。
原来的答案:
一年后,事情已经改变了一下使用.NET 4.5。 对于那些谁偶然发现了这一点,就像我一样,这里是从更多更新的摘录演练:排列Windows窗体控件在WPF MSDN上:
默认情况下,可见WindowsFormsHost元素始终绘制在其他WPF元素的顶部,他们是通过z顺序不受影响。 为了使Z排序,设置WindowsFormsHost的为true IsRedirected属性和CompositionMode财产全部或的outputOnly。
所有你需要做的,使用.NET 4.5的时候,就是添加以下属性到你的WindowsFormsHost元素IsRedirected="True"
和CompositionMode="Full"
或 CompositionMode="OutputOnly"
。
Answer 4:
在我的情况我WindowsFormsHost是两排栅。 最下面一行中有一个StackPanel取决于它所包含的内容,改变高度。 我处理这个StackPanel中的LayoutUpdated事件减去它从电网的的ActualHeight的ActualHeight调整我WindowsFormsHost。 一定要使用的ActualHeight不高。
void ResizeWinhost()
{
mainGrid.UpdateLayout();
detailPanel.UpdateLayout();
winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
}