Как открыть ссылку в элементе управления webBrowser во внешнем браузере?
У меня есть текстовое поле и элемент управления webBrowser в приложении Windows Forms. Всякий раз, когда пользователь вводит HTML-код в textBox, элемент управления webBrowser показывает свою скомпилированную форму. Код для этого:
private void textBox2_TextChanged(object sender, EventArgs e)
{
webBrowser1.DocumentText = textBox2.Text;
}
Но всякий раз, когда я нажимаю ссылку в элементе управления webBrowser, он открывается в том же элементе управления webBrowser. Я хочу, чтобы он открывался в стандартном веб-браузере системы. Итак, есть ли какое-либо событие для этого элемента управления webBrowser, который обрабатывает ссылку?
Ответы
Ответ 1
Самый простой способ сделать это - перехватить событие Navigating.
public void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
{
//cancel the current event
e.Cancel = true;
//this opens the URL in the user default browser
Process.Start(e.Url.ToString());
}
Ответ 2
Я хотел бы добавить что-то еще к этому ответу,
Coz Метод webBrowser1_Navigating выполняется каждый раз при изменении содержимого веб-браузера.
В вашем случае, когда вы устанавливаете значения в DocumentText, этот метод вызывается и когда есть нет url, а его значение по умолчанию : blank strong > .
Поэтому мы также должны проверить это, иначе он не будет загружать контент.
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;
}
}
Ответ 3
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
Возможно, вы могли бы попробовать использовать Process.Start()
в событии навигации?
Ответ 6
Потому что никто не дал достойного ответа на ссылки с 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. Вы можете поймать любой тег, который вы хотите. Затем мы присоединяем событие 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. Убедитесь, что вы используете скобки для группировки. Я также рекомендую использовать знак вопроса, чтобы он не соответствовал жадности. Затем мы сопоставляем этот шаблон и захватываем URL-адрес из групп соответствия. После этого это просто случай запуска процесса с этим URL-адресом. Это откроет браузер по умолчанию или добавит новую вкладку, если браузер по умолчанию уже открыт.
Последнее, что нам нужно сделать, это отменить логику по умолчанию для ссылок. Мы делаем это в событии NewWindow со следующим кодом.
private void webBrowserControl_NewWindow(object sender, CancelEventArgs e)
{
e.Cancel = true;
}