WindowsFormsHost始终是WPF元素中最顶级的

时间:2012-03-29 06:55:52

标签: wpf z-index windowsformshost topmost

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

4 个答案:

答案 0 :(得分:13)

根据MSDN (Layout Considerations for the WindowsFormsHost Element)

  

托管的Windows窗体控件是在单独的HWND中绘制的,所以它是   总是在WPF元素之上绘制。

这是设计限制

来自MSDN的另一篇好文章解释了在Windows中使用不同图形技术时可能出现的问题Technology Regions Overview

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

一个黑客(从未亲自尝试过,所以不确定它是否有效)是 this link

答案 1 :(得分:2)

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

如上面的评论所述,我的以下答案不再有效,并且在最终版本的.NET 4.5或后续版本中不可用。不幸的是,我所包含的链接仍然具有针对.NET的“当前版本”的HwndHosts的z排序信息,这可能导致一些人相信这个功能确实存在。它没有。没有解决方法。

原始回答:

一年后,.NET 4.5的情况发生了一些变化。对于那些偶然发现这一点的人,就像我一样,这是MSDN上Walkthrough: Arranging Windows Forms Controls in WPF的更新摘录:

  

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

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

答案 2 :(得分:2)

我刚遇到同样的问题。

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

我将def prettyIn(self, value): r = [] if not value: return () elif isinstance(value, str): if value[0] == '\'': if value[-2:] == '\'B': for v in value[1:-2]: if v == '0': r.append(0) elif v == '1': r.append(1) else: raise error.PyAsn1Error( 'Non-binary BIT STRING initializer %s' % (v,) ) return tuple(r) elif value[-2:] == '\'H': for v in value[1:-2]: i = 4 v = int(v, 16) while i: i = i - 1 r.append((v>>i)&0x01) return tuple(r) else: raise error.PyAsn1Error( 'Bad BIT STRING value notation %s' % value ) else: for i in value.split(','): j = self.__namedValues.getValue(i) if j is None: # THIS IS THE PROBLEMATIC LINE raise error.PyAsn1Error( 'Unknown bit identifier \'%s\'' % i ) if j >= len(r): r.extend([0]*(j-len(r)+1)) r[j] = 1 return tuple(r) elif isinstance(value, (tuple, list)): r = tuple(value) for b in r: if b and b != 1: raise error.PyAsn1Error( 'Non-binary BitString initializer \'%s\'' % (r,) ) return r elif isinstance(value, BitString): return tuple(value) else: raise error.PyAsn1Error( 'Bad BitString initializer type \'%s\'' % (value,) ) 控件WindowsFormsHost绑定到我的视图模型上的属性,以便在我想显示WPF时隐藏主机(及其上的控件)我们想要出现在它上面。

答案 3 :(得分:0)

在我的情况下,我的WindowsFormsHost位于两行Grid中。底行有一个StackPanel,根据它包含的内容改变高度。我处理StackPanel的LayoutUpdated事件,通过从Grid的ActualHeight中减去它的ActualHeight来调整我的WindowsFormsHost。一定要使用ActualHeight而不是高度。

     void ResizeWinhost()
    {
        mainGrid.UpdateLayout();
        detailPanel.UpdateLayout();
        winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
    }