Как открыть ссылку в элементе управления 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;
    }