2013-08-03 2 views
16

У меня есть текстовое поле и элемент управления webBrowser в приложении Windows Forms. Всякий раз, когда пользователь вводит HTML-код в textBox, элемент управления webBrowser показывает свою скомпилированную форму. Код для этого:Как открыть ссылку в элементе управления webBrowser во внешнем браузере?

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

Но всякий раз, когда я нажимаю ссылку в элементе управления WebBrowser, она открывает его в том же управления WebBrowser. Я хочу, чтобы он открывался в стандартном веб-браузере системы. Так есть ли какое-либо событие для этого элемента управления webBrowser, который обрабатывает нажатие ссылки?

+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

У меня была такая же проблема и я попробовал вышеуказанное решение. Работает, когда хром является браузером по умолчанию. Но когда IE 10 является браузером по умолчанию, он все равно открывается в элементе управления webbrowser. Есть идеи? – Feroz

+0

Я также пытаюсь использовать этот подход, но событие Navigating не срабатывает, если ссылка имеет _blank target! Я не могу найти никакого способа обойти это –

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 метод выполняется каждый раз, когда содержание WebBrowser изменяется.

В вашем случае, когда вы установите значения 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 и находит все теги, которые вы определяете там, если заявление. Для моего случая мне также нужны теги AREA. Вы можете поймать любой тег, который вы хотите. Затем мы присоединяем событие click к этому элементу.

Далее мы создаем событие с этим кодом.

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. Убедитесь, что вы используете скобки для группировки. Я также рекомендую использовать знак вопроса, чтобы он не соответствовал жадности. Затем мы сопоставляем этот шаблон и захватываем URL-адрес из групп матча. После этого это просто случай запуска процесса с этим URL-адресом. Это откроет браузер по умолчанию или добавит новую вкладку, если браузер по умолчанию уже открыт.

Последнее, что нам нужно сделать, это отменить логику по умолчанию для ссылок. Мы делаем это в событии NewWindow со следующим кодом.

private void webBrowserControl_NewWindow(object sender, CancelEventArgs e) 
    { 
     e.Cancel = true; 
    } 
Смежные вопросы