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

12

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

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

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

Спасибо.

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

Ваш Ответ

6   ответов
3

просто следуйте первому ответу для создания класса ExtendedWebBrowser.

Я использую это, чтобы открыть новую вкладку, но это также работает, чтобы открыть новое окно, используя ваш браузер, а не 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<ExtendedWebBrowser.NewWindow2EventArgs>(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=
             "<html>"+
             "<head><title>Title</title></head>"+
             "<body>"+
             "<a href = 'http://www.google.com' target = 'abc' > test </a>"+
             "</body>"+
             "</html>";
        }
        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;
        }
    }
}
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<NewWindow2EventArgs>(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 с именем «Tabs» и начальная вкладка, содержащая закрепленный дочерний элемент управления ExtendedWebBrowser с именем InitialWebBrowser)

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

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

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

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
Возможно, вы можете переопределить ContextMenu для кнопки «Открыть в новом окне». Я никогда не делал такого раньше. Удачи! sshow
Спасибо, это было очень полезно, хотя я пытаюсь получить URL, который отправляется в новое окно браузера, чтобы я мог остановить открытие нового браузера и просто открыть этот URL в новой вкладке в моем собственном браузере? Например, когда я щелкаю правой кнопкой мыши ссылку и выбираю Открыть в новом окне, я не хочу, чтобы она открывалась в новом IE, я хочу, чтобы она открывалась в новой вкладке в моем собственном веб-браузере. jay_t55

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