2009-06-10 11 views
5

Ich benutze die System.Windows.Forms.WebBrowser Kontrolle und ich muss programmatisch scrollen.Scrolling WebBrowser programmatisch manchmal nicht funktioniert

Zum Beispiel verwende ich diesen Code blättern:

WebBrowser.Document.Body.ScrollTop += WebBrowser.Height 

Das Problem ist, dass in einigen Standorten funktioniert es aber in anderen

es nicht
http://news.google.com (works good) 
http://stackoverflow.com/ (doesn't work) 

Es ist kann etwas über sein der Körpercode, aber ich kann nicht herausfinden.
Ich habe auch versucht:

WebBrowser.Document.Window.ScrollTo(0, 50) 

aber auf diese Weise ich nicht die aktuelle Position kennen.

+0

Wollen Sie vielleicht blättern, bevor das Dokument vollständig geladen ist? –

+0

nein, das Dokument ist vollständig geladen – InfoStatus

Antwort

4

In diesem Beispiel werden Eigenarten in Bildlaufleisteneigenschaften behandelt, die das angezeigte Verhalten verursachen können.

Sie müssen eine COM-Referenz zu Microsoft HTML-Objektbibliothek (Mshtml) hinzufügen, bevor dies funktioniert.

Angenommen, Sie haben einen Webbrowser namens webBrowser1, können Sie Folgendes versuchen. Ich verwende ein paar verschiedene Schnittstellen, da ich festgestellt habe, dass die für die Scroll-Eigenschaften zurückgegebenen Werte inkonsistent sind.

  using mshtml; 

// ... snip ... 

      webBrowser1.Navigate("http://www.stackoverflow.com"); 
      while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) 
      { 
       Application.DoEvents(); 
       System.Threading.Thread.Sleep(20); 
      } 
      Rectangle bounds = webBrowser1.Document.Body.ScrollRectangle; 
      IHTMLElement2 body = webBrowser1.Document.Body.DomElement as IHTMLElement2; 
      IHTMLElement2 doc = (webBrowser1.Document.DomDocument as IHTMLDocument3).documentElement as IHTMLElement2; 
      int scrollHeight = Math.Max(body.scrollHeight, bounds.Height); 
      int scrollWidth = Math.Max(body.scrollWidth, bounds.Width); 
      scrollHeight = Math.Max(body.scrollHeight, scrollHeight); 
      scrollWidth = Math.Max(body.scrollWidth, scrollWidth); 
      doc.scrollTop = 500; 
+0

Beachten Sie, dass nichts passieren wird, wenn Sie doc.scrollTop auf einen Wert setzen, der größer ist als der, zu dem gescrollt werden kann. – jjxtra

+2

Das funktioniert für mich. Sie können vermeiden, mit Reflection auf mshtml zu verweisen: var dd = browser.Document.DomDocument; var doc = dd.GetType(). InvokeMember ("documentElement", BindingFlags.GetProperty, null, dd, null); doc.GetType() .InvokeMember ("scrollTop", BindingFlags.SetProperty, null, doc, neues Objekt [] {500}); –

4
webBrowser1.Document.Window.ScrollTo(new Point(50, 50)); 

ist dies eine einfache Art und Weise zu jedem Punkt zu blättern nur geben Sie Ihre

+0

passiert nichts, die Seite wird nicht gescrollt – dialex

Verwandte Themen