WPF 3.5 WebBrowser控件和ZIndex

时间:2008-09-17 13:40:15

标签: wpf browser z-index

我试图弄清楚为什么控件不尊重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>

谢谢, - 艾德

6 个答案:

答案 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中,但当然,一旦我的图像移动到浏览器中,它就被隐藏了。

目前正致力于以下解决方案:

  1. 当图像拖动开始时,使用“RenderTargetBitmap”创建WebBrowser的位图
  2. 使用与webbrowser
  3. 相同的宽度/位置将您的位图添加到画布
  4. webControl.Visibility = Visibility.Hidden。
  5. 释放拖动后,删除位图并设置webControl.Visibility = Visible。
  6. 这个解决方案非常适合我的情况,但也许会给你一些想法。

答案 5 :(得分:1)

我设法通过使用这个结构来解决这个问题,检查每个元素中的属性配置:

<Canvas ClipToBounds="False">
     <Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
         <Expander>
            <Grid x:Name="YourContent"/>
         </Expander>
     <Popup>
</Canvas>

你只需要管理Expander来显示或隐藏你的内容,我将它用于菜单栏,我认为扩展器是可选的,具体取决于具体情况。

使用结果查看此图片,您甚至可以在WebBrowser顶部甚至在主窗口外显示控件:

enter image description here