关于浏览器:WPF 3.5 WebBrowser控件和ZIndex

WPF 3.5 WebBrowser control and ZIndex

我试图弄清楚为什么该控件不支持ZIndex。

示例1-效果很好

1
2
3
4
   <Canvas>
       <Rectangle Canvas.ZIndex="1" Height="400" Width="600" Fill="Yellow"/>
       <Rectangle Canvas.ZIndex="2" Height="100" Width="100" Fill="Red"/>
   </Canvas>

示例2-不起作用

1
2
3
4
   <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>

谢谢,
-Ed


不幸的是,这是因为WebBrowser控件是Internet Explorer COM控件的package。这意味着它拥有自己的HWND,并且不允许WPF在其上绘制任何内容。它具有与在WPF中托管任何其他Win32或WinForms控件相同的限制。

MSDN具有有关WPF / Win32互操作的更多信息。


您遇到了一个常见的WPF陷阱,通常被称为"空域问题"。一个可能的解决方案是不使用WebBrowser控件,而要疯狂一些-即将嵌入式WebKit浏览器直接呈现到WPF。有两个软件包可以执行此操作; Awesomonium(商业)和Berkelium(开源)。这两个都有一个.NETpackage器。


您可以设置SetWindowRgn来隐藏重叠区域,如下所示:

  • flounder.com
  • msdn

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

1
2
3
4
5
6
7
<Canvas ClipToBounds="False">
     <Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
         <Expander>
            <Grid x:Name="YourContent"/>
         </Expander>
     <Popup>
</Canvas>

您只需要管理扩展器以显示或隐藏您的内容,我将其用于菜单栏,我认为扩展器视情况是可选的。

查看结果的图片,您甚至可以将控件显示在WebBrowser的顶部,甚至还可以显示在主窗口之外:

enter

  • 使用与网络浏览器相同的宽度/位置将位图添加到画布
  • webControl.Visibility = Visibility.Hidden。
  • 释放拖动后,删除位图并设置webControl.Visibility = Visible。
  • 此解决方案非常适合我的情况,但也许可以为您提供一些想法。


    我解决了一个类似的问题,该问题是我在WPF应用程序中托管了一个第三方WinForms控件。我创建了一个WPF控件,该控件将WinForms控件呈现在内存中,然后将其绘制到位图。然后,在OnRender方法中使用DrawImage绘制呈现的内容。最后,我将鼠标事件从我的控件路由到了托管控件。对于网络浏览器,您还必须路由键盘事件。

    我的情况相当简单-带有一些简单鼠标交互的图表。 Web浏览器控件可能还有其他我没有考虑的问题。无论如何,我希望对您有所帮助。


    推荐阅读