我试图弄清楚为什么控件不尊重ZIndex。
示例1 - 工作正常
<Canvas>
<Rectangle Canvas.ZIndex="1" Height="400" Width="600" Fill="Yellow"/>
<Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/>
</Canvas>
示例2 - 不起作用
<Canvas>
<WebBrowser Canvas.ZIndex="1" Height="400" Width="600" Source="http://www.stackoverflow.com"/>
<Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/>
</Canvas>
谢谢, - 艾德
答案 0 :(得分:22)
不幸的是,这是因为WebBrowser控件是Internet Explorer COM控件的包装器。这意味着它获得了自己的HWND,并且不允许WPF在其上绘制任何内容。它与在WPF中托管任何其他Win32或WinForms控件具有相同的限制。
MSDN提供了有关WPF / Win32互操作的更多信息。
答案 1 :(得分:4)
您遇到了常见的WPF陷阱,最常见的是“空域问题”。一种可能的解决方案是不使用WebBrowser控件,而是使用一些更疯狂的东西 - 即直接渲染到WPF的嵌入式WebKit浏览器。有两个包可以做到这一点; Awesomonium(商业)和Berkelium(开源)。这两个都有一个.NET包装器。
答案 2 :(得分:3)
你可以通过隐藏它来使SetWindowRgn伪造重叠区域,如下所示:
答案 3 :(得分:1)
我解决了类似的问题,我在WPF应用程序中托管第三方WinForms控件。我创建了一个WPF控件,在内存中呈现WinForms控件,然后将其绘制为位图。然后我在OnRender方法中使用DrawImage来绘制渲染的内容。最后,我将鼠标事件从我的控件路由到托管控件。对于Web浏览器,您还必须路由键盘事件。
我的情况相当简单 - 一个简单的鼠标互动的图表。 Web浏览器控件可能还有其他问题,我没有考虑到这些问题。无论如何,我希望有所帮助。
答案 4 :(得分:1)
我也遇到了这个问题。在我的情况下,我将图像从一个面板拖动到WebBrowser中,但当然,一旦我的图像移动到浏览器中,它就被隐藏了。
目前正致力于以下解决方案:
这个解决方案非常适合我的情况,但也许会给你一些想法。
答案 5 :(得分:1)
我设法通过使用这个结构来解决这个问题,检查每个元素中的属性配置:
<Canvas ClipToBounds="False">
<Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
<Expander>
<Grid x:Name="YourContent"/>
</Expander>
<Popup>
</Canvas>
你只需要管理Expander来显示或隐藏你的内容,我将它用于菜单栏,我认为扩展器是可选的,具体取决于具体情况。
使用结果查看此图片,您甚至可以在WebBrowser顶部甚至在主窗口外显示控件: