WPF 3.5中的WebBrowser控件和ZIndex

10
我正在尝试弄清楚为什么控件不遵守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>

谢谢, -- Ed


您还可以使用一个透明的Popup控件,让某些内容漂浮在WebBrowser控件上方。更多信息和代码示例可以在这里找到。 - John Myczek
6个回答

21

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

MSDN 上有关于 WPF/Win32 互操作性的更多信息。


这个还有效吗?还有没有可能实现它? - Zaheer Ahmed

5

你遇到了一个常见的WPF陷阱,通常被称为“空间问题”。 一种可能的解决方案是不使用WebBrowser控件,而是选择一些更疯狂的东西 - 即直接渲染到WPF的嵌入式WebKit浏览器。 有两个包可以做到这一点; Awesomonium(商业版)和Berkelium(开源)。 这两个都有.NET封装。


3
您可以使用SetWindowRgn来伪造重叠区域并将其隐藏,如此所示:

1
@Ricky - 感谢你的批评。我会尽量避免在将来滥用这个词。我试图避免在讨论编程时使用"method"这个词,因为它在面向对象编程的上下文中有歧义。我想知道是否有更好的词可以使用。 - jpierson

1
我成功地通过使用以下结构解决了这个问题,请查看每个元素中的属性配置:
<Canvas ClipToBounds="False">
     <Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
         <Expander>
            <Grid x:Name="YourContent"/>
         </Expander>
     <Popup>
</Canvas>

你只需要管理扩展器来显示或隐藏你的内容,我正在使用它作为菜单栏,我认为扩展器是可选的,具体取决于情况。
查看这张图片的结果,你甚至可以在WebBrowser的顶部甚至窗口外部显示你的控件:

enter image description here


1

我也遇到了这个问题。在我的情况下,我正在从一个面板中拖动图像到WebBrowser中,但当我的图像移动到浏览器中时,它就被隐藏了。

目前正在开发以下解决方案:

  1. 当图片拖动开始时,使用“RenderTargetBitmap”创建一个WebBrowser的位图
  2. 将您的位图添加到画布中,并使用与WebBrowser相同的宽度/位置
  3. webControl.Visibility = Visibility.Hidden.
  4. 释放拖动时,删除您的位图并设置webControl.Visibility = Visible。

这个解决方案非常针对我的情况,但也许可以为您提供一些想法。


1

我曾经解决过一个类似的问题,当时我在我的WPF应用程序中托管了一个第三方WinForms控件。我创建了一个WPF控件,在内存中呈现WinForms控件,然后将其绘制到位图上。最后,在OnRender方法中使用DrawImage来绘制呈现的内容。最后,我将我的控件的鼠标事件路由到托管的控件。对于Web浏览器,您还需要路由键盘事件。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接