WPF 3.5 WebBrowser 控件和 ZIndex
Posted
技术标签:
【中文标题】WPF 3.5 WebBrowser 控件和 ZIndex【英文标题】:WPF 3.5 WebBrowser control and ZIndex 【发布时间】:2010-09-10 03:28:55 【问题描述】:我试图弄清楚为什么控件不支持 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.***.com"/>
<Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/>
</Canvas>
谢谢, -- 埃德
【问题讨论】:
您还可以使用透明的 Popup 控件使某些内容浮动在 WebBrowser 控件之上。更多信息和代码示例可以在here找到。 【参考方案1】:我设法通过使用这个结构解决了这个问题,查看每个元素中的属性配置:
<Canvas ClipToBounds="False">
<Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
<Expander>
<Grid x:Name="YourContent"/>
</Expander>
<Popup>
</Canvas>
你只需要管理扩展器来显示或隐藏你的内容,我将它用于菜单栏,我认为扩展器是可选的,视情况而定。
查看这张图片的结果,您甚至可以在 WebBrowser 的顶部甚至主窗口之外显示您的控件:
【讨论】:
【参考方案2】:您遇到了一个常见的 WPF 陷阱,通常称为“空域问题”。一个可能的解决方案是不使用 WebBrowser 控件,而是使用一些更疯狂的东西 - 即直接渲染到 WPF 的嵌入式 WebKit 浏览器。有两个包可以做到这一点; Awesomonium(商业)和 Berkelium(开源)。这两个都有一个 .NET 包装器。
【讨论】:
【参考方案3】:我也遇到了这个问题。在我的例子中,我将图像从一个面板拖到 WebBrowser 中,但当然,当我的图像移动到浏览器中时,它就被隐藏了。
目前正在研究以下解决方案:
-
当图像拖动开始时,使用“RenderTargetBitmap”创建 WebBrowser 的位图
将您的位图添加到画布,使用与网络浏览器相同的宽度/位置
webControl.Visibility = Visibility.Hidden。
释放拖动后,移除位图并设置 webControl.Visibility = Visible。
这个解决方案非常适合我的情况,但也许它会给你一些想法。
【讨论】:
【参考方案4】:您可以 SetWindowRgn 通过隐藏重叠区域来伪造重叠区域,如下所示:
flounder.com msdn【讨论】:
@Ricky - 感谢您的批评。以后我会尽量不误用这个词。在讨论编程时,我尽量避免使用“方法”这个词,因为在面向对象编程的上下文中使用“方法”这个词会产生歧义。我想知道是否有更好的词。【参考方案5】:我解决了一个类似的问题,我在我的 WPF 应用程序中托管了第 3 方 WinForms 控件。我创建了一个 WPF 控件,它在内存中呈现 WinForms 控件,然后将其绘制为位图。然后我在 OnRender 方法中使用 DrawImage 来绘制渲染的内容。最后,我将鼠标事件从我的控件路由到托管控件。对于网络浏览器,您还必须路由键盘事件。
我的案例相当简单——一个带有一些简单鼠标交互的图表。 Web 浏览器控件可能还有其他我没有考虑到的问题。无论如何,我希望这会有所帮助。
【讨论】:
【参考方案6】:不幸的是,这是因为 WebBrowser 控件是 Internet Explorer COM 控件的包装。这意味着它拥有自己的 HWND,并且不允许 WPF 在其上绘制任何内容。它与在 WPF 中托管任何其他 Win32 或 WinForms 控件具有相同的限制。
MSDN 有更多关于 WPF/Win32 互操作的信息。
【讨论】:
它仍然有效还是有可能实现它?以上是关于WPF 3.5 WebBrowser 控件和 ZIndex的主要内容,如果未能解决你的问题,请参考以下文章
wpf中我想在WebBrowser控件上放置一个Border控件
有没有办法在 wpf WebBrowser 控件之上呈现 WPF 控件?
WPF 和 WinForms WebBrowser 控件之间存在哪些功能差异?