2008-09-17 117 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