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>

谢谢, - 埃德

4

6 回答 6

22

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

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

于 2008-09-17T13:41:55.763 回答
5

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

于 2010-11-17T14:21:30.113 回答
3

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

于 2009-05-07T17:18:45.463 回答
1

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

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

于 2008-09-17T20:14:54.197 回答
1

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

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

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

这个解决方案非常适合我的情况,但也许它会给你一些想法。

于 2010-04-03T19:02:49.007 回答
1

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

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

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

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

在此处输入图像描述

于 2013-11-12T17:53:41.613 回答