it-swarm.com.ru

Открыть ссылку в новой вкладке (элемент управления WebBrowser)

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

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

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

Спасибо.

12
jay_t55

Основываясь на ваших комментариях, я понимаю, что вы хотите перехватить действие «Открыть в новом окне» для элемента управления 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»)

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

26
Robert Venables
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;
}
4
sshow

Я провел небольшое исследование по этой теме, и нет необходимости выполнять все 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.

3
eugen_nw

Следующий код работает, просто следуйте первому ответу для создания класса 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); 
        }
3
Dev

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

Вот полностью рабочий пример. Это предполагает, что у вас есть вкладка управления и по крайней мере 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;
        }
    }
}
0
Alexander Ryan Baggett