Вопрос по winforms, webbrowser-control, .net, c#, tabcontrol – Открыть ссылку в новой вкладке (элемент управления WebBrowser)

12

Кто-нибудь знает, как щелкнуть ссылку в элементе управления WebBrowser в приложении WinForms, а затем открыть эту ссылку на новой вкладке внутри моего TabControl?

искал месяцами, видел много учебников / статей / примеров кода, но кажется, что никто никогда не пробовал это на C # раньше.

Любые советы / образцы с благодарностью.

Спасибо'

m кто-то еще, кто имеет проблемы с открытием, когда я нажимаю на ссылку веб-страницы в моем собственном браузере. Перепробовал все вышеперечисленное, но не повезло, первый ответ Роберта Я добавил ExtendedWebBrowser в режиме разработки, но яя все еще получаю красную линию внизу (InitialTabBrowser) в последней строке кода и предупреждение о 'InitialTabBroswer не существует в текущем контексте, Любые дополнительные советы / советы будут отличными. user1169764

Ваш Ответ

6   ответов
-2

В элементе управления веб-браузера нет вкладок, поэтому вам нужно обрабатывать вкладки самостоятельно. Добавьте элемент управления вкладками над элементом управления веб-браузера и создайте новые элементы управления веб-браузера при открытии новых вкладок. Поймать и отменить, когда пользователь открывает новые окна и вместо этого открывать новые вкладки.

3

Я провел небольшое исследование по этой теме, и нет необходимости выполнять все COM-соединения, которые присутствуют в классе ExtendedWebBrowser, так как этот код уже присутствует в сгенерированном Interop.SHDocVw. Таким образом, я смог использовать более естественную конструкцию ниже, чтобы подписаться на событие NewWindow2. В Visual Studio мне пришлось добавить ссылку наMicrosoft Internet Controls ".

    using SHDocVw;
    ...

    internal WebBrowserSsoHost(System.Windows.Forms.WebBrowser webBrowser,...)
    {
        ParameterHelper.ThrowOnNull(webBrowser, "webBrowser");
        ...

        (webBrowser.ActiveXInstance as WebBrowser).NewWindow2 += OnNewWindow2;
    }

    private void OnNewWindow2(ref object ppDisp, ref bool Cancel)
    {
        MyTabPage tabPage = TabPageFactory.CreateNewTabPage();
        tabPage.SetBrowserAsContent(out ppDisp);
    }

Пожалуйста, прочитайтеhttp://bit.ly/IDWm5A для получения дополнительной информации. Это страница № 5 в серии, для полного понимания я должен был вернуться и прочитать страницы 3 -> 5.

Какие'это все? Как это использовать? Kosmos
26

Исходя из ваших комментариев, я понимаю, что вы хотите поймать "Открыть в новом окне " действие для элемента управления WebBrowser и переопределить поведение по умолчанию, чтобы вместо этого открывать на новой вкладке внутри приложения.

Для надежного выполнения этого вам нужно получить событие NewWindow2, которое предоставляет ppDisp (устанавливаемый указатель на элемент управления WebBrowser, который должен открывать новое окно). Все другие потенциальные взломанные вместе решения (такие как получение последней ссылки, выбранной пользователем перед событием OpenWindow) не являются оптимальными и обязательно будут терпеть неудачу в угловых случаях.

К счастью, есть (относительно) простой способ сделать это, все еще используя элемент управления System.Windows.Forms.WebBrowser в качестве основы. Все, что вам нужно сделать, это расширить WebBrowser и перехватить событие NewWindow2, одновременно предоставляя открытый доступ к экземпляру ActiveX (для перехода в ppDisp на новых вкладках). Это было сделано раньше, и у Маурисио Рохаса есть отличный пример с полным рабочим классом ».ExtendedWebBrowser ":

http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c-webbrowsercontrol.aspx

Когда у вас есть класс ExtendedWebBrowser, все, что вам нужно сделать, это настроить обработчики для NewWindow2 и указать ppDisp на браузер на новой вкладке. Вот'Вот пример, который я собрал:

    private void InitializeBrowserEvents(ExtendedWebBrowser SourceBrowser)
    {
        SourceBrowser.NewWindow2 += new EventHandler(SourceBrowser_NewWindow2);
    }

    void SourceBrowser_NewWindow2(object sender, NewWindow2EventArgs e)
    {

        TabPage NewTabPage = new TabPage()
        {
            Text = "Loading..."
        };

        ExtendedWebBrowser NewTabBrowser = new ExtendedWebBrowser()
        {
            Parent = NewTabPage,
            Dock = DockStyle.Fill,
            Tag = NewTabPage
        };

        e.PPDisp = NewTabBrowser.Application;
        InitializeBrowserEvents(NewTabBrowser);

        Tabs.TabPages.Add(NewTabPage);
        Tabs.SelectedTab = NewTabPage;

    }

    private void Form1_Load(object sender, EventArgs e)
    {

        InitializeBrowserEvents(InitialTabBrowser);

    }

(Предполагается, что TabControl по имени "Вкладки» и начальная вкладка, содержащая закрепленный дочерний элемент управления ExtendedWebBrowser с именем "InitialWebBrowser ")

Дон»не забудьте отменить регистрацию событий, когда вкладки закрыты!

Роберт, большое спасибо за пример кода и ссылку :-) У меня есть пара вопросов, я добавил класс и назвал его ExtendedWebBrowser.cs, а затем добавил свой пример кода в файл Form1.cs, и он дает мне следующая ошибка при попытке отладки: "Аргумент '1' не может конвертировать из 'System.Windows.Forms.WebBrowser to 'ExtendedWebBrowser «. А синяя волнистая линия появляется под следующей строкой кода: InitializeBrowserEvents (InitialTabBrowser); Ты знаешь что это? jay_t55
Убедитесь, что ваш InitialWebBrowser имеет тип "ExtendedWebBrowser» - Похоже, вы все еще используете "Веб-браузер", Чтобы добавить ExtendedWebBrowser, посмотрите в своем наборе инструментов. Вы должны видеть это к вершине с маленьким символом механизма рядом с этим. Это то, что вы должны добавить к своей форме в режиме конструктора для элемента управления InitialWebBrowser. Robert Venables
По какой-то странной причине для меня все еще открывается новое окно во внешнем веб-браузере, хотя я использую ExtendedWebBrowser и событие NewWindow2 для создания нового веб-браузера. Kosmos
Большое спасибо за это, Роберт. Вы'Я был таким полезным. :) jay_t55
3

Следующий код работает, просто следуйте первому ответу для создания класса ExtendedWebBrowser.I '

Я использую это, чтобы открыть новую вкладку, но это также работает, чтобы открыть новое окно, используя ваш браузер, а не IE.

Надеюсь, поможет.

 private void Window_Loaded(object sender, RoutedEventArgs e)
    {
        if (current_tab_count == 10) return;
        TabPage tabPage = new TabPage("Loading...");
        tabpages.Add(tabPage);
        tabControl1.TabPages.Add(tabPage);
        current_tab_count++;
        ExtendedWebBrowser browser = new ExtendedWebBrowser();
        InitializeBrowserEvents(browser);
        webpages.Add(browser);
        browser.Parent = tabPage;
        browser.Dock = DockStyle.Fill;
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
        browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged);
        browser.Navigated += Browser_Navigated;
        browser.IsWebBrowserContextMenuEnabled = true;
public void InitializeBrowserEvents(ExtendedWebBrowser browser)
    {
        browser.NewWindow2 += new EventHandler(Browser_NewWindow2);
    }

    void Browser_NewWindow2(object sender, ExtendedWebBrowser.NewWindow2EventArgs e)
    {

        if (current_tab_count == 10) return;
        TabPage tabPage = new TabPage("Loading...");
        tabpages.Add(tabPage);
        tabControl1.TabPages.Add(tabPage);
        current_tab_count++;
        ExtendedWebBrowser browser = new ExtendedWebBrowser();
        webpages.Add(browser);
        browser.Parent = tabPage;
        browser.Dock = DockStyle.Fill;
        browser.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(browser_DocumentCompleted);
        browser.DocumentTitleChanged += new EventHandler(Browser_DocumentTitleChanged);
        browser.Navigated += Browser_Navigated;
        tabControl1.SelectedTab = tabPage;
        browser.Navigate(textBox.Text);

        {
            e.PPDisp = browser.Application;
            InitializeBrowserEvents(browser); 
        }
Большое спасибо, ОЧЕНЬ большое Dev. Код работает отлично, выпотрясающе! Большое спасибо, приятель. : D jay_t55
0

Вы просто отменяете новое событие окна и обрабатываете элементы навигации и вкладки самостоятельно.

Вот полностью рабочий пример. Это предполагает, что у вас есть вкладка управления и по крайней мере 1 вкладка на месте.

using System.ComponentModel;
using System.Windows.Forms;

namespace stackoverflow2
{

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            this.webBrowser1.NewWindow += WebBrowser1_NewWindow;
            this.webBrowser1.Navigated += Wb_Navigated;
            this.webBrowser1.DocumentText=
             ""+
             "Title"+
             ""+
             "<a href="http://www.google.com" target="abc"> test </a>"+
             ""+
             "";
        }
        private void WebBrowser1_NewWindow(object sender, CancelEventArgs e)
        {
            e.Cancel = true; //stop normal new window activity

            //get the url you were trying to navigate to
            var url= webBrowser1.Document.ActiveElement.GetAttribute("href");

            //set up the tabs
            TabPage tp = new TabPage();
            var wb = new WebBrowser();
            wb.Navigated += Wb_Navigated;
            wb.Size = this.webBrowser1.Size;
            tp.Controls.Add(wb);
            wb.Navigate(url);
            this.tabControl1.Controls.Add(tp);
            tabControl1.SelectedTab = tp;
        }

        private void Wb_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            tabControl1.SelectedTab.Text = (sender as WebBrowser).DocumentTitle;
        }
    }
}
4
private Uri _MyUrl;    

System.Windows.Forms.WebBrowser browser = new System.Windows.Forms.WebBrowser();
browser.Navigating += new System.Windows.Forms.WebBrowserNavigatingEventHandler(browser_Navigating);


void browser_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs e)
{
    _MyUrl = e.Url;
    e.Cancel;
}
Спасибо, если я покажуя успешный яЯ опубликую код для всех, если онихотел бы знать как яникогда не видел, чтобы кто-нибудь делал это где-нибудь в Интернете на C # раньше ... jay_t55
Спасибо, это было очень полезно, хотя я пытаюсь получить URL, который отправляется в новое окно браузера, чтобы я мог остановить открытие нового браузера и просто открыть этот URL в новой вкладке в моем собственном браузере? Например, когда я щелкаю правой кнопкой мыши ссылку и выбираю Открыть в новом окне, я неЯ хочу, чтобы он открывался в новом IE. Я хочу, чтобы он открывался в новой вкладке в моем собственном браузере. jay_t55
Может быть, вы можете переопределить ContextMenu для "Открыть в новом окне " кнопка. Я'никогда раньше такого не делал. Удачи! sshow

Похожие вопросы