2008-09-17 119 views
10

我想弄清楚为什么控件不尊重ZIndex。WPF 3.5 WebBrowser控件和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> 

感谢, - 埃德

回答

21

可惜这是因为WebBrowser控件是一个包装在Internet Explorer COM控件周围。这意味着它获得了自己的HWND,并且不允许WPF在其上绘制任何东西。它具有与在WPF中托管任何其他Win32或WinForms控件相同的限制。

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

1

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

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

3

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

+1

@Ricky - 谢谢你的批评。我会尽量不要在将来滥用这个词。在讨论编程时,我尝试避免使用单词方法,因为在面向对象编程的上下文中使用单词方法时存在歧义。我想知道是否有更好的词。 – jpierson 2011-03-24 14:30:50

3

你也可以使用一个透明的弹出式菜单控件有东西浮在顶部的WebBrowser控件。更多信息和代码示例可参见here

+4

我不喜欢Popups,因为即使切换到另一个应用程序,它们仍倾向于保留在屏幕上,并且它们似乎并未附加到应用程序,所以当您调整大小/移动应用程序时,弹出窗口不会随它。 – Rachel 2010-10-13 17:55:51

1

我也遇到了这个问题。在我的情况下,我将图像从一个面板拖入WebBrowser,但当我的图像移入浏览器时,它一隐藏起来。

以下解决方案目前工作:

  1. 当拖动图像开始,创建web浏览器的一个位图使用“RenderTargetBitmap”
  2. 你的位图添加到画布上,使用相同的宽度/位置为webbrowser
  3. webControl.Visibility = Visibility.Hidden。
  4. 当拖动被释放时,移除你的位图并设置webControl.Visibility = Visible。

该解决方案对我的情况非常具体,但也许它会给你一些想法。

4

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

1

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

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

你只需要管理扩展到显示或隐藏内容,我用它一个菜单栏,我认为扩展器是可选的,取决于案件。

退房这张照片,结果,你甚至可以显示你的控件在web浏览器的顶部,甚至外面的主窗口:

enter image description here