在WebBrowser控件中打开新的网页选项卡

3

我在我的C#应用程序中使用WebBrowser控件,想要在其中打开网页。
这已经完全实现了。

我的问题是:

任何链接其目标为_blank的网页将在新的IE窗口中打开。

我想在我的应用程序中以新标签页的形式打开这样的链接。

如何做到呢?

谢谢!

3个回答

2
private void Browser_ProgressChanged(object sender, WebBrowserProgressChangedEventArgs e)
{
    var webBrowser = (WebBrowser)sender;
    if (webBrowser.Document != null)
    {
        foreach (HtmlElement tag in webBrowser.Document.All)
        {
            if (tag.Id == null)
            {
                tag.Id = String.Empty;
                switch (tag.TagName.ToUpper())
                {
                    case "A":
                    {
                        tag.MouseUp += new HtmlElementEventHandler(link_MouseUp);
                        break;
                    }
                }
            }
        }
    }
}


private void link_MouseUp(object sender, HtmlElementEventArgs e)
{
    var link = (HtmlElement)sender;
    mshtml.HTMLAnchorElementClass a = (mshtml.HTMLAnchorElementClass)link.DomElement;
    switch (e.MouseButtonsPressed)
    {
        case MouseButtons.Left:
        {
            if ((a.target != null && a.target.ToLower() == "_blank") || e.ShiftKeyPressed || e.MouseButtonsPressed == MouseButtons.Middle)
            {
                AddTab(a.href);
            }
            else
            {
                CurrentBrowser.TryNavigate(a.href);
            }
            break;
        }
        case MouseButtons.Right:
        {
            CurrentBrowser.ContextMenuStrip = null;
            var contextTag = new ContextTag();
            contextTag.Element = a;
            contextHtmlLink.Tag = contextTag;
            contextHtmlLink.Show(Cursor.Position);
            break;
        }
    }
}

更多信息请查看dotBrowser.sf.net项目。


1

有两种方法可以解决这个问题。两种方法都是从捕获点击事件开始,然后检测是否点击了“a”元素。

方法1只需获取URL,取消点击,并打开一个新标签页。可以通过在正确的位置实例化一个新的WebBrowser控件来实现打开新标签页。

方法2只需从target中删除_blank,这样页面将在当前浏览器中打开,而不是生成另一个浏览器窗口。

private void Go(string url)
{
    webBrowser1.Navigate(url);
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted);
}

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    webBrowser1.Document.Click += new HtmlElementEventHandler(Document_Click);
}

void Document_Click(object sender, HtmlElementEventArgs e)
{
    HtmlElement ele = webBrowser1.Document.GetElementFromPoint(e.MousePosition);
    while (ele != null)
    {
        if (ele.TagName.ToLower() == "a")
        {
            // METHOD-1
            // Use the url to open a new tab
            string url = ele.GetAttribute("href");
            // TODO: open the new tab
            e.ReturnValue = false;

            // METHOD-2
            // Use this to make it navigate to the new URL on the current browser/tab
            ele.SetAttribute("target", "_self");
        }
        ele = ele.Parent;
    }
}

然而,请注意这些方法无法通过JavaScript阻止浏览器窗口在应用程序之外被打开。


希望你在两年前我问同样的问题时就在身边了,哈哈。感谢你的回答!非常感激! :) - anon271334
1
@Lucifer,我今年28岁。两年前我肯定还在这里。:D 无论何时都可以随时向我提问。:D 感谢您的支持。 - Fun Mun Pieng
哦,在这种情况下你怎么做呢:<a href='somepage' target='_blank'> <b>我的链接</b></a>。 - user421125
2
@Mostafa Shaeri,我已经编辑了我的答案以处理嵌套元素。 - Fun Mun Pieng

1

这似乎是浏览器控件的常见问题。它并不是一个完全功能的浏览器,像选项卡浏览和弹出窗口等功能都很麻烦。

我在网上找到了很多东西,只是说“你不能用这个控件做那个”。这有点像推卸责任。但我曾经偶然发现this project,它扩展了控件以添加额外的功能。它有点老了,我实际上没有使用过它。但它声称通过“选项卡”或MDI控件对目标链接提供了额外的支持。也许值得一试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接