【问题标题】:How to open a link in webBrowser control in external browser?如何在外部浏览器的 webBrowser 控件中打开链接?
【发布时间】:2013-08-04 19:51:01
【问题描述】:

我的 Windows 窗体应用程序中有一个 textBox 和一个 webBrowser 控件。每当用户在 textBox 中输入 HTML 代码时,webBrowser 控件都会显示其编译后的表单。代码:

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

但是,每当我单击 webBrowser 控件中的链接时,它都会在同一个 webBrowser 控件中打开它。我想要的是它应该在系统的默认网络浏览器中打开。那么这个 webBrowser 控件是否有任何事件来处理链接点击?

【问题讨论】:

  • 我想知道如果您在网络浏览器控件target="_blank" 内创建所有链接会发生什么?
  • @Tombatron 我刚刚发布了这个问题的新答案,请参考。

标签: c# .net winforms webbrowser-control


【解决方案1】:

最简单的方法是拦截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());
}

【讨论】:

  • 我遇到了同样的问题并尝试了上述解决方案。当 chrome 是默认浏览器时工作。但是当 IE 10 是默认浏览器时,它仍然在 webbrowser 控件中打开。有什么想法吗?
  • 我也在尝试这种方法,但是如果链接有 _blank 目标,则导航事件不会触发!我找不到任何解决方法
  • @EricLegault 我刚刚发布了这个问题的新答案,请参考。
  • 除此之外,还请参阅下面的答案(@Trikaldarshi,@Gaugeforever)以获得完整的解决方案。
【解决方案2】:

我想在这个答案中添加更多内容,

Coz webBrowser1_Navigating 方法在每次更改 webBrowser 的内容时执行。

在您的情况下,每当您将值设置为 DocumentText 时,当有 没有 url 并且其默认值为 about:blank强>。 所以我们也应该检查一下,否则它不会加载任何内容。

    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】:

    这里的代码应该可以工作:

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

    我试过这个以确保它有效并且确实有效!

    希望这会有所帮助!

    【讨论】:

      【解决方案4】:

      Process.Start 将在默认浏览器中打开 URL,然后您只需告诉 WebBrowser 控件取消导航。

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

      我刚刚创建了一个示例应用来测试它 - 它工作正常。

      【讨论】:

        【解决方案5】:

        也许您可以尝试在导航事件中使用Process.Start()

        【讨论】:

          【解决方案6】:

          因为没有人对其中带有target="_blank" 的链接做出正确的回答。我会尝试这样做。

          首先,为什么这不起作用?因为当用户单击 Web 浏览器控件中的链接时,它不会触发导航事件,而是触发新窗口事件。在新窗口事件中,您无权访问被单击以中断新窗口并打开默认窗口的 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 测试正则表达式。确保使用括号进行分组。我还建议使用问号不要贪婪匹配。然后我们匹配该模式并从匹配组中获取 url。之后,只需使用该 url 启动进程即可。这将打开默认浏览器,或者如果您的默认浏览器已打开,则添加一个新选项卡。

          我们需要做的最后一件事是取消链接的默认逻辑。我们使用以下代码在 NewWindow 事件中执行此操作。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-11-23
            • 2014-07-12
            • 2018-02-11
            • 2017-08-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多