Ouvrir le lien dans le nouvel onglet (contrôle WebBrowser))

est-ce que quelqu'un sait comment cliquer sur un lien dans le contrôle WebBrowser dans une application WinForms et ensuite avoir ce lien ouvert dans un nouvel onglet à L'intérieur de mon TabControl?

j'ai cherché pendant des mois, vu beaucoup de tutoriels / articles / échantillons de code mais il semble que personne n'ait jamais essayé cela dans C# avant.

Tous les conseils/échantillons sont grandement appréciés.

je vous Remercie.

12
demandé sur abatishchev 2009-08-17 12:19:47

6 réponses

basé sur vos commentaires, je comprends que vous voulez piéger l'action "Ouvrir dans une nouvelle fenêtre" pour le contrôle WebBrowser, et Outrepasser le comportement par défaut pour ouvrir dans un nouvel onglet à l'intérieur de votre application à la place.

pour accomplir ceci de manière fiable, vous devez obtenir à L'événement NewWindow2, qui expose ppDisp (un pointeur réglable vers le contrôle WebBrowser qui devrait ouvrir la nouvelle fenêtre). Toutes les autres solutions de hacked together (telles que l'obtention du dernier lien sélectionné par l'utilisateur avant L'événement OpenWindow) ne sont pas optimaux et sont voués à l'échec dans les cas de coin.

heureusement, il y a une façon (relativement) simple d'accomplir ceci tout en utilisant le système.Windows.Forme.Contrôle WebBrowser comme une base. Tout ce que vous devez faire est d'étendre le WebBrowser et d'intercepter L'événement NewWindow2 tout en fournissant un accès public à L'Instance ActiveX (pour passer dans ppDisp dans les nouveaux onglets). Cela a déjà été fait, et Mauricio Rojas en a un excellent exemple. avec une classe ouvrière complète "ExtendedWebBrowser":

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

Une fois que vous avez la classe ExtendedWebBrowser, tout ce que vous avez à faire est de configurer les gestionnaires pour NewWindow2 et de pointer ppDisp vers un navigateur dans un nouvel onglet. Voici un exemple que j'ai mis en place:

    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);

    }

(suppose TabControl nommé "Tabs" et l'onglet initial contenant le contrôle de l'enfant arrimé ExtendedWebBrowser named "InitialWebBrowser")

N'oubliez pas de désinscrire Les événements lorsque les onglets sont fermés!

26
répondu Robert Venables 2009-09-05 23:14:50
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
répondu sshow 2009-08-17 14:24:13

le code suivant fonctionne, il suffit de suivre la première réponse pour créer la classe ExtendedWebBrowser.

j'utilise ceci pour ouvrir un nouvel onglet mais cela fonctionne aussi pour ouvrir une nouvelle fenêtre en utilisant votre navigateur et pas IE.

j'Espère que ça aide.

 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
répondu Dev 2009-11-01 22:35:59

j'ai fait un peu de recherche sur ce sujet et on n'a pas besoin de faire tout le com plomberie qui est présent dans la classe ExtendedWebBrowser, car ce code est déjà présent dans L'Interop généré.SHDocVw. En tant que tel, j'ai pu utiliser la construction plus naturelle ci-dessous pour m'abonner à L'événement NewWindow2. Dans Visual Studio, j'ai dû ajouter une référence à "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);
    }

Merci de lire http://bit.ly/IDWm5A pour plus d'info. C'est la page #5 dans la série, pour une compréhension complète j'ai dû retourner en arrière et lire les pages 3 - > 5.

3
répondu eugen_nw 2012-04-25 15:39:10

vous annulez simplement l'événement de la nouvelle fenêtre et vous occupez de la navigation et de l'onglet stuff vous-même.

voici un exemple qui fonctionne parfaitement. Cela suppose que vous avez un tabcontrol et au moins une page d'onglet en place.

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
répondu Alexander Ryan Baggett 2018-04-24 19:36:44

il n'y a pas d'onglet dans le contrôle du navigateur web, vous devez donc gérer les onglets vous-même. Ajouter un contrôle d'onglet au-dessus du contrôle de navigateur web et créer de nouveaux contrôles de navigateur Web lorsque de nouveaux onglets sont ouverts. Attrapez et annulez quand l'utilisateur ouvre de nouvelles fenêtres et ouvrez de nouveaux onglets à la place.

-2
répondu svinto 2009-09-05 18:03:54