WPF 3.5 WebBrowser控件和ZIndex

时间:2020-03-05 18:58:54  来源:igfitidea点击:

我试图弄清楚为什么该控件不支持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控件相同的限制。

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

回答

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

我的案例是通过一些简单的鼠标交互就相当简单的图表。 Web浏览器控件可能还有其他我没有考虑的问题。无论如何,我希望能有所帮助。

回答

我们可以通过SetWindowRgn隐藏重叠区域来伪造重叠区域,如下所示:

  • flounder.com
  • msdn

回答

我们还可以使用透明的Popup控件使某些内容浮在WebBrowser控件的顶部。在这里可以找到更多信息和代码示例。

回答

我也遇到了这个问题。以我为例,我是将图像从一个面板拖到WebBrowser中,但是,当然,只要将图像移到浏览器中,它就会被隐藏。

当前正在研究以下解决方案:

  • 当开始图像拖动时,使用" RenderTargetBitmap"创建WebBrowser的位图。
  • 使用与网络浏览器相同的宽度/位置将位图添加到画布
  • webControl.Visibility = Visibility.Hidden。
  • 释放拖动后,删除位图并设置webControl.Visibility = Visible。

此解决方案非常适合我的情况,但也许可以为我们提供一些想法。

回答

我们遇到了一个常见的WPF陷阱,通常被称为"空域问题"。一种可能的解决方案是不使用WebBrowser控件,而采取一些更疯狂的做法,即将嵌入式WebKit浏览器直接呈现到WPF。有两个软件包可以做到这一点。 Awesomonium(商业)和Berkelium(开源)。这两个都有一个.NET包装器。