2012-02-09 17 views
6

Tengo un formulario con el control del explorador web, que carga una página web (Su funcionando bien, se carga la página ok)¿Cómo encontrar la posición de un elemento en el control del navegador web?

Ahora mi problema es que quiero para encontrar si una URL-enlace esté por debajo del pliegue o por encima el pliegue (es decir, si el usuario tiene que desplazarse hacia abajo para ver este enlace, o no) si este v es visible con desplazamiento hacia fuera o que tenga que desplazarse para verlo .. espero ser clara

He realizado una búsqueda exhaustiva, pero parece que no hay información disponible sobre cómo encontrar una posición de elementos html (arriba o debajo de la vista actual)

¿Alguien más? sabe algo de esto y puede indicarme la dirección correcta, por favor? (estoy buscando la solución C# - WinForms)

Actualización: Muchas gracias a John Koerner por el código. Realmente aprecio el tiempo y el esfuerzo que puso para resolver mi problema.

Y a Jonathan & todos los demás también .. Desearía poder marcar la respuesta de Jonathans también como respuesta, pero solo permite marcar una respuesta como respuesta. Su comentario también fue claro y útil pista. ¡Gracias, chicos, chicos!

+0

Metro? WinForms? WPF? Silverlight? MonoTouch? – SLaks

+0

WinForms (editado y agregado) –

+0

Si no está visible, ¿solo desea desplazarlo a la vista? Si es así, puede usar el método ScrollIntoView para mostrarlo. –

Respuesta

7

Ok, he probado esto en google y stackoverflow y parece que funciona:

private bool isElementVisible(WebBrowser web, string elementID) 
{ 

    var element = web.Document.All[elementID]; 

    if (element == null) 
     throw new ArgumentException(elementID + " did not return an object from the webbrowser"); 

    // Calculate the offset of the element, all the way up through the parent nodes 
    var parent = element.OffsetParent; 
    int xoff = element.OffsetRectangle.X; 
    int yoff = element.OffsetRectangle.Y; 

    while (parent != null) 
    { 
     xoff += parent.OffsetRectangle.X; 
     yoff += parent.OffsetRectangle.Y; 
     parent = parent.OffsetParent; 
    } 

    // Get the scrollbar offsets 
    int scrollBarYPosition = web.Document.GetElementsByTagName("HTML")[0].ScrollTop; 
    int scrollBarXPosition = web.Document.GetElementsByTagName("HTML")[0].ScrollLeft; 

    // Calculate the visible page space 
    Rectangle visibleWindow = new Rectangle(scrollBarXPosition, scrollBarYPosition, web.Width, web.Height); 

    // Calculate the visible area of the element 
    Rectangle elementWindow = new Rectangle(xoff,yoff,element.ClientRectangle.Width, element.ClientRectangle.Height); 

    if (visibleWindow.IntersectsWith(elementWindow)) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

después utilizarla, sólo tiene que llamar:

isElementVisible(webBrowser1, "topbar") //StackOverflow's top navigation bar 
+0

guau .. impresionante. Gracias John Koemer. Realmente aprecio el esfuerzo y el tiempo que pones para ayudarme. La mejor de las suertes ... Bueno chicos, todos ustedes son simplemente excelentes. ¡¡¡¡Muchas gracias!!!! –

+0

Has hecho mi día gracias John –

3

que tienen y la idea que podría funcionar (nunca había probado, pero es lo mejor que puedo ofrecer a usted, lo siento)

Usted puede llamar a los javascript funciones en el webbrowsercontrol: LINK

También puede make javascripts funciones que le dan la posición de un elemento: LINK

Si combina estos dos conceptos, puede saber si el elemento es visible o no, ya que conoce el tamaño del control webbrowser.

Tenga en cuenta que puede insertar código javascript en el webbrowsercontrol. Este mensaje SO explica cómo hacerlo: LINK

Buena suerte.

+0

gracias jonathan. Voy a intentarlo. Si alguien tiene alguna solución rápida o un método más simple, no dude en agregarlo –

+0

Jonahtan, me gustaría poder marcar su respuesta también como respuesta, pero solo permite marcar una respuesta como respuesta. Su comentario también fue claro y útil pista. Han calificado su respuesta en su lugar –

+0

Gracias: D No importa. Estamos aquí para ayudar a personas, no para los puntos. – Jonathan

Cuestiones relacionadas