12
votes

Lien ouvert dans nouvel onglet (contrôle WebBrowser)

Quelqu'un peut-il savoir comment cliquer sur un lien dans la commande WebBrowser dans une application WinForms puis que ce lien soit ouvert dans un nouvel onglet à l'intérieur de My TabControl?

Je cherche des mois, j'ai vu de nombreux tutoriels / articles / échantillons de code, mais il semble que personne n'a jamais essayé cela en C # avant.

Des conseils / échantillons sont grandement appréciés.

merci.


1 commentaires

Je suis quelqu'un d'autre qui a des problèmes d'ouverture à la fois que je clique sur un lien de page Web dans mon propre navigateur. Essayé tout ce qui précède mais pas de chance, la première réponse de Robert I a ajouté ExtendanceWebBrowser en mode de conception, mais je reçois toujours la ligne rouge sous (InitialTabbrowser) sur la dernière ligne de code et que l'avertissement de 'initialTabbroswer n'existe pas dans le contexte actuel '. Plus de conseils / conseils serait génial.


6 Réponses :


4
votes
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;
}

2 commentaires

Merci Sshow, ce qui était très utile, bien que j'essaie d'obtenir l'URL envoyée à la nouvelle fenêtre du navigateur afin que je puisse arrêter le nouveau navigateur d'ouvrir et d'ouvrir cette URL dans un nouvel onglet dans mon propre navigateur? Par exemple, lorsque j'ai cliqué avec le bouton droit de la souris sur un lien et sélectionnez Ouvrir dans une nouvelle fenêtre, je ne veux pas qu'il s'ouvre dans un nouveau IE, je souhaite qu'il s'ouvre dans un nouvel onglet dans mon propre WebBrowser


Peut-être que vous pouvez remplacer le contexteMenu pour le bouton "Ouvrir dans la nouvelle fenêtre". Je n'ai jamais fait une telle chose auparavant. Bonne chance!



27
votes

Basé sur vos commentaires, je comprends que vous souhaitez piéger l'action "Ouvrir dans la nouvelle fenêtre" pour le contrôle WebBrowser et remplacer le comportement par défaut pour s'ouvrir dans un nouvel onglet dans votre application à la place.

Pour accomplir cela. De manière fiable, vous devez obtenir à l'événement Newwindow2, qui expose PPDISP (un pointeur réglable sur le contrôle WebBrowser qui devrait ouvrir la nouvelle fenêtre). Tous les autres potentiels piraté ensemble des solutions (telles que l'obtention du dernier lien sélectionné par l'utilisateur avant l'événement OpenWindowOW) ne sont pas optimales et sont liées à l'échec dans les cas d'angle.

Heureusement, il existe un moyen simple (relativement) de l'accomplir tout en utilisant toujours le contrôle System.Windows.Forms.webBrowser comme base. Tout ce que vous avez à faire est d'étendre le WebBrowser et d'intercepter l'événement NewWindow2 tout en offrant un accès public à l'instance ActiveX (pour passer dans PPDISP dans les nouveaux onglets). Cela a été fait auparavant, et Mauricio Rojas a un excellent exemple avec une classe de travail complète "ExtendedwebBrowser":

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

Une fois que vous avez la classe ExtendedWebBrowser, tout ce que vous avez à faire est de configurer des gestionnaires de Newwindow2 et Point PPDISP sur un navigateur dans un nouvel onglet. Voici un exemple que je mets ensemble: xxx

(assume tabcontrol nommé "onglets" et une onglet initial contenant la commande enfant dockedwebbrowser nommé "InitialWebBrowser")

N'oubliez pas de nuire aux événements lorsque les onglets sont fermés!


3 commentaires

Merci beaucoup Robert pour le code d'échantillon et le lien :-) J'ai quelques questions, j'ai ajouté une classe et j'ai appelé ExtendedwebBrowser.cs, puis a ajouté votre exemple de code dans le fichier Form1.cs et cela me donne la Après erreur lorsque j'essaie de déboguer: "Argument" 1 "Impossible de convertir de" System.Windows.Forms.WebBrowser vers "ExtendedWebBrowser". " Et la ligne bleue Squigly apparaît sous la ligne de code suivante: InitializeBrowerseevents (initialTabbrowser); Sais-tu ce que c'est?


Assurez-vous que votre initialWebBrowser est de type "ExtendedWebBrowser" - on dirait que vous utilisez toujours le "WebBrowser". Pour ajouter l'extensionWebBrowser, consultez votre boîte à outils. Vous devriez le voir vers le haut avec un petit symbole d'engrenage à côté de celui-ci. C'est ce que vous devez ajouter à votre formulaire en mode de conception pour le contrôle initialWebBrowser.


Pour une nouvelle fenêtre bizarre, une nouvelle fenêtre est toujours ouverte dans un navigateur Web externe pour moi, cependant que j'utilise ExtendieWebBrowser et à l'aide d'événements NewWindow2 pour créer un nouveau navigateur Web.



-2
votes

Il n'y a pas de tabulation dans le contrôle du navigateur Web, vous devez vous occuper de l'onglets vous-même. Ajoutez une commande d'onglet au-dessus du contrôle du navigateur Web et créez de nouvelles commandes de navigateur Web lorsque de nouveaux onglets sont ouverts. Attrapez et annulez lorsque l'utilisateur ouvre de nouvelles fenêtres et ouvrez les nouveaux onglets à la place.


0 commentaires

3
votes

Le code suivant fonctionne, suivez simplement la première réponse pour la création de la classe ExtendedWebBrowser.

J'utilise cela pour ouvrir un nouvel onglet, mais cela fonctionne également pour ouvrir une nouvelle fenêtre à l'aide de votre navigateur et non.

espère qu'il aide. xxx


0 commentaires

3
votes

J'ai fait un peu de recherche sur ce sujet et il n'est pas nécessaire de faire toute la plomberie COM qui est présente dans la classe ExtendedWebBrowser, car ce code est déjà présent dans l'INTEROP.SHDOCVW généré. En tant que tel, j'ai pu utiliser la construction plus naturelle ci-dessous pour vous abonner à l'événement NewWindow2. Dans Visual Studio, je devais ajouter une référence à "Microsoft Internet Controls". XXX

Veuillez lire http://bit.ly/idwm5a pour plus d'informations. C'est la page n ° 5 de la série, car une compréhension complète que je devais revenir en arrière et lire les pages 3 -> 5.


1 commentaires

Qu'est-ce que tout ça? Comment l'utiliser?



0
votes

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

Voici un exemple de travail complet. Cela suppose que vous avez un tabcontrol et au moins 1 page d'onglet en place. P>

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 commentaires