Открыть новую веб-страницу в новой вкладке в элементе управления WebBrowser - PullRequest
2 голосов
/ 15 марта 2011

Я использую WebBrowser control в своем приложении c # и хочу открыть в нем веб-страницы.
Это полностью сделано.

Моя проблема:

Любая ссылкана веб-странице, цель которой _blank, откроется в новом окне IE.

Я хотел бы открыть такую ​​ссылку в новой вкладке в моем приложении.

Как это сделать?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 15 марта 2011
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 голос
/ 15 марта 2011

Похоже, что это общая проблема с управлением браузером. Это не совсем полнофункциональный браузер, и такие вещи, как просмотр во вкладках и всплывающие окна, доставляют немало хлопот.

Многие вещи, которые я нахожу в Интернете, просто говорят: «Вы не можете сделать это с помощью этого элемента управления». Вид отговорки, правда. Но в прошлом я наткнулся на этот проект , который расширяет возможности управления для добавления дополнительных функций. Это довольно старое, и я фактически не использовал это. Но он претендует на дополнительную поддержку целевых ссылок с помощью «вкладок» или элементов управления MDI. Может стоит попробовать.

0 голосов
/ 15 марта 2011

Есть два способа обойти это.Оба метода начинаются с захвата события click и последующего определения, был ли нажат элемент «a».

Метод 1 просто получает URL, отменяет щелчок и открывает новую вкладку.Открытие новой вкладки может быть достигнуто простым созданием нового элемента управления WebBrowser в нужном месте.

Метод 2 просто удаляет _blank из target, чтобы страница открывалась в текущем браузере, а не появляласьдругое окно браузера.

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.

...