我试图找出为什么该控件不尊重 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 控件具有相同的限制。

微软软件定义网络 有有关 WPF/Win32 互操作的更多信息。

其他提示

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

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

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

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

我也遇到了这个问题。就我而言,我将图像从一个面板拖到 Web 浏览器中,但是当然,一旦我的图像移到浏览器中,它就被隐藏了。

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

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

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

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

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

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

看看这张图片的结果,您甚至可以在 Web 浏览器顶部甚至主窗口之外显示控件:

enter image description here

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top