2009-10-17 8 views
2

J'ai le contrôle WebBrowser pour ouvrir les liens dans mon navigateur par défaut comme ceci:webbrowser iframes ouvert dans le navigateur par défaut

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
    { 
     if (e.Url.ToString() != "about:blank") 
     { 
      e.Cancel = true; 
      System.Diagnostics.Process.Start(e.Url.ToString()); 
     } 
    } 

Cela fonctionne très bien, mais si je charge un document contenant des éléments iFrame ceux-ci seront ouvert également dans le navigateur du système (principalement des éléments intégrés, comme Google Maps, les icônes Digg, etc.). Comment puis-je conserver les iframes dans le contrôle Webbrowser et les liens cliqués par l'utilisateur dans le navigateur du système?

+0

Vous disposez d'un contrôle WebBrowser dans votre Windows Form. Et vous voulez que certaines URL soient lancées dans le navigateur du système d'exploitation et certaines dans votre fenêtre de formulaire? –

+0

Exactement. La façon dont je le fais maintenant n'est pas optimale. Les éléments de la page comme iframe déclenchent l'événement Navigating, donc j'obtiens des parties d'une page "pop-up" dans Firefox pendant que le reste (comme les images) se charge tranquillement dans le contrôle de Webbrowser. Seuls les liens cliqués par l'utilisateur devraient s'ouvrir dans le navigateur par défaut. –

Répondre

2

Je suis arrivé à la conclusion que le composant .NET WebBrowser est presque inutile à cet égard. J'ai essayé de lire WebBrowserNavigatingEventArgs.TargetFrameName mais il retournera l'attribut name de l'élément iframe seulement si le document HTML l'a. Sinon, il crachera une chaîne "" vide. Renvoyer la valeur null sur les liens non-frame aurait été beaucoup plus utile.

La seule solution que j'ai trouvée pour cela est d'utiliser le contrôle AxWebBrowser et d'écouter spécifiquement l'événement BeforeNavigate2. Je n'ai pas testé autant que je devrais, mais il semble que la propriété "flags" dans DWebBrowserEvents2_BeforeNavigate2Event est définie sur chaque fois que l'utilisateur est déclenché.

private void axWebBrowser1_BeforeNavigate2(object sender, AxSHDocVw.DWebBrowserEvents2_BeforeNavigate2Event e) 
{ 
    // 64 means user triggered 
    if ((int)e.flags == 64 && e.uRL.ToString() != "about:blank") 
    { 
     e.cancel = true; 
     System.Diagnostics.Process.Start(e.uRL.ToString()); 
    } 
} 

docs MSDN dit que flags est un IE7 + seul paramètre, donc je ne sais pas ce qui se passe sur les machines IE6 ...

Using Internet Explorer from .NET a quelques informations vraiment précieuses sur AxWebBrowser.

+0

également à noter, il n'est pas nécessaire d'utiliser le contrôle COM. Vous pouvez facilement développer WebBrowser pour vous connecter aux événements requis (dans ce cas, BeforeNavigate2) comme décrit sur http://blogs.artinsoft.net/mrojas/archive/2008/09/18/newwindow2-events-in-the-c -webbrowsercontrol.aspx –

+0

a enfin pu tester ça sur IE6 et que sais-tu? Ça marche. Yay! –

Questions connexes