2013-08-03 50 views
16

我在我的Windows窗體應用程序中有一個textBox和一個webBrowser控件。每當用戶在文本框中輸入HTML代碼時,webBrowser控件將顯示其編譯後的表單。造成這種情況的代碼:如何在外部瀏覽器中打開web瀏覽器控件中的鏈接?

private void textBox2_TextChanged(object sender, EventArgs e) 
{ 
    webBrowser1.DocumentText = textBox2.Text; 
} 

但每當我點擊WebBrowser控件的鏈接,它會打開它在同一WebBrowser控件。我想要的是它應該在系統的默認Web瀏覽器中打開。那麼是否有任何處理鏈接點擊的web瀏覽器控件事件?

+0

我想知道如果您在網頁瀏覽器控件'target =「_ blank」'裏面設置所有鏈接會發生什麼? – Tombatron

+0

@Tombatron我剛剛發佈了一個關於這個問題的新答案,請參考它。 – Gaugeforever

回答

21

最簡單的方法是截取Navigating事件。

public void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    //cancel the current event 
    e.Cancel = true; 

    //this opens the URL in the user's default browser 
    Process.Start(e.Url.ToString()); 
} 
+0

感謝這工作:) –

+0

我有同樣的問題,並嘗試了上述解決方案。當chrome是默認瀏覽器時有效。但是,當IE 10是默認瀏覽器時,它仍然會在網頁瀏覽器控件中打開。有任何想法嗎? – Feroz

+0

我正在嘗試這種方法,但是如果鏈接有一個_blank目標,則導航事件不會觸發!我無法找到任何解決方法 –

3

也許你可以嘗試在導航事件中使用Process.Start()

4

Process.Start將打開默認瀏覽器的URL,然後你只要告訴WebBrowser控制取消導航。

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    Process.Start(e.Url.ToString()); 

    e.Cancel = true; 
} 

我剛剛創建了一個示例應用程序來測試它 - 它工作。

4

這裏該代碼應工作:

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    System.Diagnostics.Process.Start(e.Url.ToString()); 

    e.Cancel = true; 
} 

我嘗試這樣做,以確保它的工作,它呢!

希望這有助於!

5

我想更多的東西添加到這個答案,

怎麼把webBrowser1_Navigating當web瀏覽器的內容發生變化方法執行每次。

在,只要你設置的值:DocumentText你的情況下,這個方法被調用當有沒有URL和它的默認值是約:空白。 所以我們也應該檢查它否則它不會加載任何內容。

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

因爲沒有人對他們中的target="_blank"的鏈接做出正確的回答。我會嘗試這樣做。

首先,爲什麼不工作?因爲當用戶點擊瀏覽器控件中的鏈接時,它不會觸發導航事件,它會觸發新的窗口事件。在新窗口事件中,您無權訪問單擊的URL或元素以中斷新窗口並打開默認窗口。這是你如何做到的。

首先,在您的文檔完成事件中添加以下代碼。

private void webBrowserControl_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     string tagUpper = ""; 

     foreach (HtmlElement tag in (sender as WebBrowser).Document.All) 
     { 
      tagUpper = tag.TagName.ToUpper(); 

      if((tagUpper == "AREA") || (tagUpper == "A")) 
      { 
       tag.MouseUp += new HtmlElementEventHandler(this.link_MouseUp); 
      } 
     } 
    } 

這樣做是經過所有的HTML元素標記,發現您在if語句定義存在的所有標籤。對於我的情況,我也需要AREA標籤。你可以捕捉任何你想要的標籤。然後,我們在該元素上附加一個點擊事件。

接下來我們用這段代碼創建事件本身。

void link_MouseUp(object sender, HtmlElementEventArgs e) 
    { 
     Regex pattern = new Regex("href=\\\"(.+?)\\\""); 
     Match match = pattern.Match((sender as HtmlElement).OuterHtml); 
     string link = match.Groups[1].Value; 

     Process.Start(link); 
    } 

此代碼建立了一個正則表達式,你很可能需要改變這種模式根據自己的需要。我建議在這裏添加一個斷點,看看你的正則表達式需要看看。你可以在regex link上測試正則表達式。確保你使用括號進行分組。我也建議使用問號不要貪婪。然後,我們匹配該模式,並從比賽的組中獲取網址。之後,這只是一個使用該網址開始流程的情況。這將打開默認瀏覽器,或者如果您的默認瀏覽器已打開,請添加新選項卡。

我們需要做的最後一件事是取消鏈接的默認邏輯。我們使用下面的代碼在NewWindow事件中執行此操作。

private void webBrowserControl_NewWindow(object sender, CancelEventArgs e) 
    { 
     e.Cancel = true; 
    } 
相關問題