2009-06-10 22 views
5

Sto utilizzando il controllo System.Windows.Forms.WebBrowser e ho bisogno di fare scrolling programmatico.Lo scorrimento del browser Web a volte non funziona

Per esempio, io uso questo codice per scorrere verso il basso:

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

Il problema è che in alcuni siti funziona ma in altri non è così

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

E 'può essere qualcosa su il codice del corpo, ma non riesco a capire.
Ho anche provato:

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

ma in questo modo non so la posizione corrente.

+0

Stai forse cercando di scorrere prima che il documento è stato completamente caricato? –

+0

no, il documento è completamente caricato – InfoStatus

risposta

4

Questo esempio risolve i quirk nelle proprietà della barra di scorrimento che possono causare il comportamento visualizzato.

È necessario aggiungere un riferimento COM alla libreria di oggetti HTML Microsoft (mshtml) prima che funzioni.

Supponendo di avere un WebBrowser denominato webBrowser1, è possibile provare quanto segue. Io uso un paio di interfacce diverse perché ho trovato che i valori restituiti per le proprietà di scorrimento sono incoerenti.

  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

Nota che se si imposta doc.scrollTop su un valore maggiore di quello a cui è possibile scorrere, non si verificherà nulla. – jjxtra

+2

Questo funziona per me. È possibile evitare di fare riferimento a mshtml utilizzando reflection: var dd = browser.Document.DomDocument; var doc = dd.GetType(). InvokeMember ("documentElement", BindingFlags.GetProperty, null, dd, null); doc.GetType() .InvokeMember ("scrollTop", BindingFlags.SetProperty, null, doc, new object [] {500}); –

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

questo è un modo semplice per scorrere fino a ogni punto basta inserire il tuo

+0

non accade nulla, la pagina non scorre – dialex

Problemi correlati