如何设置z-index windowsformhost,它们并不总是位于WPF元素的顶部?
答案 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;
}