2009-06-10 13 views
5

Estoy usando el control System.Windows.Forms.WebBrowser y tengo que hacer el desplazamiento programado.Desplazar WebBrowser programáticamente a veces no funciona

Por ejemplo, utilizo este código para desplazarse hacia abajo:

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

El problema es que en algunos sitios que funciona, pero en otros no lo hace

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

Es puede ser algo el código del cuerpo, pero no puedo entenderlo.
También he intentado:

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

pero de esta manera no sé la posición actual.

+0

¿Está tal vez tratando de desplazarse antes de que el documento se ha cargado completamente? –

+0

no, el documento está completamente cargado – InfoStatus

Respuesta

4

Este ejemplo funciona alrededor de caprichos en las propiedades de la barra de desplazamiento que pueden causar el comportamiento que está viendo.

Deberá agregar una referencia COM a la Biblioteca de objetos HTML de Microsoft (mshtml) antes de que esto funcione.

Suponiendo que tiene un WebBrowser llamado webBrowser1, puede intentar lo siguiente. Utilizo un par de interfaces diferentes porque he encontrado que los valores devueltos para las propiedades de desplazamiento son inconsistentes.

  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

Tenga en cuenta que si establece doc.scrollTop en un valor mayor al que se puede desplazar, nada sucederá. – jjxtra

+2

Esto funciona para mí. Puede evitar hacer referencia a mshtml utilizando 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)); 

esta es una manera fácil para desplazarse a todos los puntos con tan sólo introducir su

+0

no pasa nada, la página no se desplaza – dialex

Cuestiones relacionadas