【发布时间】:2012-03-29 06:55:52
【问题描述】:
如何设置 z-index windowsformhost 不总是在 WPF 元素的顶部?
【问题讨论】:
-
简单的答案:你不能。见here。
-
是否已经有新的解决方案如何解决这个问题?
标签: wpf z-index windowsformshost topmost
如何设置 z-index windowsformhost 不总是在 WPF 元素的顶部?
【问题讨论】:
标签: wpf z-index windowsformshost topmost
根据 MSDN (Layout Considerations for the WindowsFormsHost Element)
托管的 Windows 窗体控件在单独的 HWND 中绘制,因此它是 始终绘制在 WPF 元素之上。
这是设计限制
另一篇来自 MSDN 的好文章解释了在 Windows 中使用不同图形技术时可能出现的问题,Technology Regions Overview
但是我在谷歌上搜索发现似乎有一些黑客行为(称为空域限制)
一个 hack(从未亲自尝试过,所以不确定它是否有效)在 this link
我也遇到了同样的问题。
有一个潜在的解决方法 - 取决于 Windows 主机窗口控件的性质和您想要显示的 WPF 元素:
我将WindowsFormsHost 控件的Visibility 绑定到我的视图模型上的一个属性,以使我能够在我想要显示我们想要出现在它上面的WPF 时隐藏主机(及其上的控件)。
【讨论】:
几年后更新(2016-09):
正如顶部评论所指出的,我的以下回答不再有效,并且在 .NET 4.5 的最终版本或后续版本中不可用。不幸的是,我包含的链接仍然包含针对 .NET 的“当前版本”的 HwndHosts 的 z 排序信息,这可能会让一些人相信这个功能确实存在。它没有。没有变通方法。
原答案:
一年后,.NET 4.5 发生了一些变化。对于那些偶然发现这一点的人,就像我一样,这里是 MSDN 上Walkthrough: Arranging Windows Forms Controls in WPF 的更新摘录:
默认情况下,可见的 WindowsFormsHost 元素始终绘制在其他 WPF 元素之上,并且不受 z-order 的影响。 要启用 z 排序,请将 WindowsFormsHost 的 IsRedirected 属性设置为 true,并将 CompositionMode 属性设置为 Full 或 OutputOnly。
在使用 .NET 4.5 时,您只需将以下属性添加到您的 WindowsFormsHost 元素 IsRedirected="True" 和 CompositionMode="Full" 或 CompositionMode="OutputOnly"。
【讨论】:
在我的情况下,我的 WindowsFormsHost 位于两行网格中。底行有一个 StackPanel,它会根据它包含的内容更改高度。我处理 StackPanel 的 LayoutUpdated 事件,通过从 Grid 的 ActualHeight 中减去它的 ActualHeight 来调整我的 WindowsFormsHost 的大小。请务必使用 ActualHeight 而不是 Height。
void ResizeWinhost()
{
mainGrid.UpdateLayout();
detailPanel.UpdateLayout();
winHost.Height = mainGrid.ActualHeight - detailPanel.ActualHeight - 5;
}
【讨论】: