WPF 3.5 WebBrowser控件和ZIndex
我试图弄清楚为什么该控件不支持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>
谢谢,
-埃德
解决方案
回答
不幸的是,这是因为WebBrowser控件是Internet Explorer COM控件的包装。这意味着它拥有自己的HWND,并且不允许WPF在其上绘制任何内容。它具有与在WPF中托管任何其他Win32或者WinForms控件相同的限制。
MSDN具有有关WPF / Win32互操作的更多信息。
回答
我在WPF应用程序中托管了一个第三方WinForms控件时解决了一个类似的问题。我创建了一个WPF控件,该控件将WinForms控件呈现在内存中,然后将其绘制到位图。然后,在OnRender方法中使用DrawImage绘制呈现的内容。最后,我将鼠标事件从我的控件路由到了托管控件。对于网络浏览器,我们还必须路由键盘事件。
我的案例是通过一些简单的鼠标交互就相当简单的图表。 Web浏览器控件可能还有其他我没有考虑的问题。无论如何,我希望能有所帮助。
回答
我们可以通过SetWindowRgn隐藏重叠区域来伪造重叠区域,如下所示:
- flounder.com
- msdn
回答
我们还可以使用透明的Popup控件使某些内容浮在WebBrowser控件的顶部。在这里可以找到更多信息和代码示例。
回答
我也遇到了这个问题。以我为例,我是将图像从一个面板拖到WebBrowser中,但是,当然,只要将图像移到浏览器中,它就会被隐藏。
当前正在研究以下解决方案:
- 当开始图像拖动时,使用" RenderTargetBitmap"创建WebBrowser的位图。
- 使用与网络浏览器相同的宽度/位置将位图添加到画布
- webControl.Visibility = Visibility.Hidden。
- 释放拖动后,删除位图并设置webControl.Visibility = Visible。
此解决方案非常适合我的情况,但也许可以为我们提供一些想法。
回答
我们遇到了一个常见的WPF陷阱,通常被称为"空域问题"。一种可能的解决方案是不使用WebBrowser控件,而采取一些更疯狂的做法,即将嵌入式WebKit浏览器直接呈现到WPF。有两个软件包可以做到这一点。 Awesomonium(商业)和Berkelium(开源)。这两个都有一个.NET包装器。