WPF 3.5 WebBrowser控件和ZIndex
我想弄清楚为什么控件不尊重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>
感谢, - 埃德
可惜这是因为WebBrowser控件是一个包装在Internet Explorer COM控件周围。这意味着它获得了自己的HWND,并且不允许WPF在其上绘制任何东西。它具有与在WPF中托管任何其他Win32或WinForms控件相同的限制。
MSDN有关于WPF/Win32互操作的更多信息。
我解决了类似的问题,我在我的WPF应用程序中托管第三方WinForms控件。我创建了一个WPF控件,它将内存中的WinForms控件呈现,然后将其绘制为位图。然后我在OnRender方法中使用DrawImage来绘制渲染的内容。最后,我将鼠标事件从我的控件路由到托管控件。在Web浏览器的情况下,您还必须路由键盘事件。
我的情况相当简单 - 一个简单的鼠标交互的图表。 Web浏览器控件可能有其他问题,我没有考虑到。无论如何,我希望这有助于。
我也遇到了这个问题。在我的情况下,我将图像从一个面板拖入WebBrowser,但当我的图像移入浏览器时,它一隐藏起来。
以下解决方案目前工作:
- 当拖动图像开始,创建web浏览器的一个位图使用“RenderTargetBitmap”
- 你的位图添加到画布上,使用相同的宽度/位置为webbrowser
- webControl.Visibility = Visibility.Hidden。
- 当拖动被释放时,移除你的位图并设置webControl.Visibility = Visible。
该解决方案对我的情况非常具体,但也许它会给你一些想法。
您正遇到一个常见的WPF陷阱,通常称为“空域问题”。一种可能的解决方案是不使用WebBrowser控件,而是使用一些比较疯狂的东西 - 即直接将嵌入式WebKit浏览器呈现给WPF。有两个包可以做到这一点; Awesomonium(商业)和Berkelium(开放源代码)。这两个都有一个.NET包装器。
我设法通过采用这种结构来解决这个问题,检查出的属性配置中的每个元素:
<Canvas ClipToBounds="False">
<Popup AllowsTransparency="True" ClipToBounds="False" IsOpen="True">
<Expander>
<Grid x:Name="YourContent"/>
</Expander>
<Popup>
</Canvas>
你只需要管理扩展到显示或隐藏内容,我用它一个菜单栏,我认为扩展器是可选的,取决于案件。
退房这张照片,结果,你甚至可以显示你的控件在web浏览器的顶部,甚至外面的主窗口:
@Ricky - 谢谢你的批评。我会尽量不要在将来滥用这个词。在讨论编程时,我尝试避免使用单词方法,因为在面向对象编程的上下文中使用单词方法时存在歧义。我想知道是否有更好的词。 – jpierson 2011-03-24 14:30:50