WindowsFormsHost总是从WPF元素最顶级WindowsFormsHost总是从WPF元

2019-05-12 02:59发布

如何设置的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;
    }


文章来源: WindowsFormsHost is always the most top from WPF element