【问题标题】:Open new web page in new tab in WebBrowser control在 WebBrowser 控件的新选项卡中打开新网页
【发布时间】:2011-03-15 13:16:12
【问题描述】:

我在我的 c# 应用程序中使用WebBrowser 控件,我想在其中打开网页。
完全搞定了。

我的问题:

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

我想在我的应用程序的新标签中打开此类链接。

怎么做?

谢谢!

【问题讨论】:

    标签: c# .net winforms tabs webbrowser-control


    【解决方案1】:
    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 项目中查看更多信息

    【讨论】:

      【解决方案2】:

      这似乎是浏览器控件的常见问题。它并不是一个真正功能齐全的浏览器,标签式浏览和弹出窗口之类的东西对它来说很痛苦。

      我在网上找到的很多东西都只是说“你不能用这个控件做到这一点”。真的是一种逃避现实。但是我过去偶然发现了this project,它扩展了控件以添加其他功能。它有点旧,我还没有真正使用它。但它声称通过“选项卡”或 MDI 控件对目标链接有额外的支持。可能值得一试。

      【讨论】:

        【解决方案3】:

        有两种方法可以解决这个问题。这两种方法都从捕获点击事件开始,然后检测是否点击了“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 在您的应用程序之外打开。

        【讨论】:

        • 我希望你是在 2 年前我问同样的问题时,哈哈。谢谢回答!非常感激! :)
        • @Lucifer,我今年 28 岁。我肯定是大约 2 年前。 :D 无论如何,请随时向我提问。 :D 感谢您的投票
        • 哦,这种情况你怎么办: 我的链接
        • @Mostafa Shaeri,我已经编辑了我的答案来处理嵌套元素。
        猜你喜欢
        • 2010-11-20
        • 2023-03-05
        • 1970-01-01
        • 1970-01-01
        • 2017-08-27
        • 1970-01-01
        • 2011-04-23
        • 2017-01-05
        • 1970-01-01
        相关资源
        最近更新 更多