Come si apre un collegamento nel controllo webBrowser nel browser esterno?

Ho un controllo TextBox e un controllo WebBrowser nella mia applicazione Windows Form. Ogni volta che un utente inserisce un codice HTML in textBox, il controllo webBrowser mostra il suo modulo compilato. Il codice per questo:

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

Ma ogni volta che faccio clic su un collegamento nel controllo webBrowser, esso si apre nello stesso controllo webBrowser. Quello che voglio è che dovrebbe aprirsi nel browser Web predefinito del sistema. Quindi c’è qualche evento per questo controllo webBrowser che gestisce il link cliccando?

Il modo più semplice per farlo sarebbe intercettare l’evento di navigazione .

 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()); } 

Vorrei aggiungere qualcosa in più a questa risposta,

Il metodo Coz webBrowser1_Navigating viene eseguito ogni volta che viene modificato il contenuto del browser web.

Nel tuo caso ogni volta che imposti i valori su DocumentText questo metodo viene chiamato e quando non c’è url e il suo valore predefinito è about: blank . Quindi dovremmo anche controllare questo perché altrimenti non caricherà alcun contenuto.

  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; } } 

Process.Start aprirà l’URL nel browser predefinito e quindi dirai semplicemente al controllo WebBrowser di annullare la navigazione.

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

Ho appena creato un’app di esempio per testarlo, ha funzionato.

Questo codice qui dovrebbe funzionare:

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

Ho provato questo per essere sicuro che funzionasse e lo fa!

Spero che questo ti aiuti!!

Forse potresti provare a utilizzare Process.Start() sull’evento Navigating?

Perché nessuno ha fatto una risposta decente ai link con target="_blank" in loro. Proverò a farlo.

Innanzitutto, perché non funziona? Perché quando un utente fa clic su un collegamento nel controllo del browser Web, non triggers l’evento di navigazione, ma triggers l’evento della nuova finestra. Nell’evento della nuova finestra, non hai accesso all’URL o all’elemento su cui è stato fatto clic per interrompere la nuova finestra e aprirne una predefinita. Ecco come lo fai.

Per prima cosa, nel tuo evento completato nel documento aggiungi il seguente codice.

  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); } } } 

Ciò che fa è passare attraverso tutti i tag dell’elemento html e trova tutti i tag che definisci lì nell’istruzione if. Per il mio caso, avevo bisogno anche dei tag AREA. Puoi prendere qualsiasi tag che vuoi. Alleghiamo quindi un evento click su quell’elemento.

Successivamente creiamo l’evento stesso con questo codice.

  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); } 

Questo codice stabilisce un modello regex, molto probabilmente dovrai modificare questo modello per le tue esigenze . Vi consiglio di aggiungere un punto di interruzione qui e di vedere come deve essere vista la vostra espressione regolare. È ansible verificare l’espressione regolare al collegamento regex . Assicurati di utilizzare le parentesi per il raggruppamento. Raccomando anche di usare il punto interrogativo per non combaciare avidamente. Corrispondiamo quindi a quel modello e prendiamo l’url dai gruppi della partita. Dopodiché, è semplicemente un caso di avviare un processo con quell’URL. Questo aprirà il browser predefinito o aggiungerà una nuova scheda se il browser predefinito è già aperto.

L’ultima cosa che dobbiamo fare è cancellare la logica predefinita per i collegamenti. Lo facciamo nell’evento NewWindow con il seguente codice.

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