2009-09-18 9 views
8

Nous avons un navigateur Web dans notre application Winforms pour bien afficher l'historique d'un élément sélectionné rendu par xslt.C# Accédez aux ancres dans le contrôle WebBrowser

Le xslt écrit < des balises > dans le fichier html en sortie pour permettre au contrôle webBrowser de naviguer vers l'entrée d'historique sélectionnée. Comme nous ne naviguons pas sur le html au sens strict du Web, plutôt que de définir le HTML par le DocumentText, je ne peux pas naviguer vers les ancres désirées avec un #AnchorName, car l'Url de webBrowser est nul (edit: en fait à la fin, il s'agit de: blank).

Comment est-ce que je peux naviguer dynamiquement aux balises d'ancrage dans le html du contrôle de navigateur Web dans ce cas?

EDIT:

Merci sdolphion pour la pointe, c'est le code final je

void _history_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
    { 
     _completed = true; 
     if (!string.IsNullOrEmpty(_requestedAnchor)) 
     { 
      JumpToRequestedAnchor(); 
      return; 
     } 
    } 

    private void JumpToRequestedAnchor() 
    { 
     HtmlElementCollection elements = _history.Document.GetElementsByTagName("A"); 
     foreach (HtmlElement element in elements) 
     { 
      if (element.GetAttribute("Name") == _requestedAnchor) 
      { 
       element.ScrollIntoView(true); 
       return; 
      } 
     } 
    } 

Répondre

10

Je suis sûr que quelqu'un a une meilleure façon de le faire, mais voici ce que je faisais accomplir cette tâche.

HtmlElementCollection elements = this.webBrowser.Document.Body.All; 
foreach(HtmlElement element in elements){ 
    string nameAttribute = element.GetAttribute("Name"); 
    if(!string.IsNullOrEmpty(nameAttribute) && nameAttribute == section){ 
     element.ScrollIntoView(true); 
     break; 
    } 
} 
+0

Juste trouvé une référence à cette ligne et je teste maintenant. Marquer comme réponse quand je le confirme. – johnc

+0

Bien que j'utilise Document.GetElementByName plutôt que la boucle – johnc

+0

Merci d'avoir posté votre mise à jour, j'ai changé la mienne pour qu'elle corresponde plus à la vôtre. – sdolphin

5

Je sais que cette question est vieux et a une excellente réponse, mais cela n'a pas été suggéré encore, il pourrait être utile pour les autres qui viennent ici à la recherche d'une réponse.

Une autre façon de le faire est d'utiliser l'ID de l'élément dans le code HTML.

<p id="section1">This is a test section</p>

Ensuite, vous pouvez utiliser

HtmlElement sectionAnchor = webBrowserPreview.Document.GetElementById("section1"); 
if (sectionAnchor != null) 
{ 
    sectionAnchor.ScrollIntoView(true); 
} 

où webBrowserPreview est le contrôle de votre navigateur Web.

Sinon, sectionAnchor.ScrollIntoView(false) n'apportera l'élément à l'écran au lieu de l'aligner avec le haut de la page

+0

Pardonnez mon ignorance. Où 'webBrowserPreview' est-il défini? –

+1

Wow, je ne peux pas croire que j'ai raté ça et personne ne l'a remarqué avant maintenant. C'est un contrôle WebBrowser dans votre formulaire. J'ai ajouté cette précision à ma réponse. – dbooher

Questions connexes