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 WebBrowser 控件之上呈现 WPF 控件?

WPF 和 WinForms WebBrowser 控件之间存在哪些功能差异?

WPF 使用Win32API 让控件置于WebBrowser上方

WPF 使用Win32API 让控件置于WebBrowser上方