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 控件具有相同的限制。
微软软件定义网络 有有关 WPF/Win32 互操作的更多信息。
其他提示
您遇到了一个常见的 WPF 陷阱,最常称为“空域问题”。一个可能的解决方案是不使用 WebBrowser 控件,而是采用一些更疯狂的东西 - 即直接呈现到 WPF 的嵌入式 WebKit 浏览器。有两个包可以做到这一点;Awesomium(商业)和 Berkelium(开源)。这两个都有一个 .NET 包装器。
我解决了一个类似的问题,即我在 WPF 应用程序中托管第 3 方 WinForms 控件。我创建了一个 WPF 控件,它在内存中呈现 WinForms 控件,然后将其绘制为位图。然后我在OnRender方法中使用DrawImage来绘制渲染的内容。最后,我将鼠标事件从我的控件路由到托管控件。对于网络浏览器,您还必须路由键盘事件。
我的案例相当简单——一个带有一些简单的鼠标交互的图表。Web 浏览器控件可能还有其他我没有考虑到的问题。无论如何,我希望这会有所帮助。
我也遇到了这个问题。就我而言,我将图像从一个面板拖到 Web 浏览器中,但是当然,一旦我的图像移到浏览器中,它就被隐藏了。
目前正在研究以下解决方案:
- 当图像拖动开始时,使用“RenderTargetBitmap”创建 Web 浏览器的位图
- 将位图添加到画布,使用与网络浏览器相同的宽度/位置
- webControl.Visibility = Visibility.Hidden。
- 释放拖动后,删除位图并设置 webControl.Visibility = Visible。
这个解决方案非常适合我的情况,但也许它会给你一些想法。
我设法使用此结构解决了这个问题,检查每个元素中的属性配置:
<Canvas ClipToBounds="False">
<Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
<Expander>
<Grid x:Name="YourContent"/>
</Expander>
<Popup>
</Canvas>
您只需管理扩展器即可显示或隐藏您的内容,我将其用于菜单栏,我认为扩展器是可选的,具体取决于情况。
看看这张图片的结果,您甚至可以在 Web 浏览器顶部甚至主窗口之外显示控件: