2009-10-17 215 views
2

我已經得到了WebBrowser控件在我的默認瀏覽器打開鏈接這樣的:web瀏覽器的I幀在默認瀏覽器中打開

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
    { 
     if (e.Url.ToString() != "about:blank") 
     { 
      e.Cancel = true; 
      System.Diagnostics.Process.Start(e.Url.ToString()); 
     } 
    } 

這個偉大的工程,但如果我加載了一個包含一些IFrame的內容的文件的會也在系統瀏覽器中打開(主要是嵌入式內容,如Google Maps,Digg圖標等)。

如何保持Webbrowser控件中的iframe加載和用戶單擊系統瀏覽器中的鏈接?

+0

您的Windows窗體中有WebBrowser控件。你想要在操作系統的瀏覽器中啓動一些Url,並在窗體窗口中啓動一些Url? – 2009-10-17 17:59:58

+0

準確。我現在這樣做的方式並不理想。像iframe這樣的頁面元素會觸發Navigating事件,所以我會在Firefox中彈出一部分頁面,而其餘部分(如圖像)在Webbrowser控件中靜靜地加載。 只有用戶點擊的鏈接應該在默認瀏覽器中打開。 – 2009-10-17 19:00:29

回答

2

我已經得出結論,.NET WebBrowser組件在這方面幾乎沒用。我試圖閱讀WebBrowserNavigatingEventArgs.TargetFrameName,但它只會返回iframe元素的name屬性,只有在HTML文檔具有該屬性時。否則,它會吐出一個空的""字符串。在非幀鏈接上返回null會更有用。

所以我找到的唯一修復方法是使用AxWebBrowser控件,特別是在收聽BeforeNavigate2事件。我沒有儘可能多地進行測試,但看起來DWebBrowserEvents2_BeforeNavigate2Event中的「flags」屬性在每次用戶觸發時都設置爲。

private void axWebBrowser1_BeforeNavigate2(object sender, AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2Event e) 
{ 
    // 64 means user triggered 
    if ((int)e.flags == 64 && e.uRL.ToString() != "about:blank") 
    { 
     e.cancel = true; 
     System.Diagnostics.Process.Start(e.uRL.ToString()); 
    } 
} 

MSDN文檔說,flags是IE7 +唯一的參數,所以我不知道對IE6的機器會發生什麼......

Using Internet Explorer from .NET有關於AxWebBrowser一些真正有價值的信息。

+0

也要注意,沒有必要使用COM控件。您可以輕鬆地展開WebBrowser,以便按照http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c中所述掛鉤所需事件(在這種情況下爲BeforeNavigate2) -webbrowsercontrol.aspx – 2009-11-07 20:01:15

+0

終於在IE6上測試了一下,你知道些什麼?有用。好極了! – 2009-11-12 12:13:52

相關問題