2012-02-09 15 views
6

Ho un modulo con controllo del browser web, che carica una pagina Web (funziona bene, la pagina viene caricata ok)Come trovare la posizione di un elemento nel controllo del browser Web?

Ora il mio problema è, voglio scoprire se un particolare url-link è sotto la piega o sopra la piega (voglio dire, se l'utente deve scorrere verso il basso per vedere questo link, o no) se questo v è visibile con fuori scorretto oppure abbiamo bisogno di scorrere per vedere esso .. spero chiaro

ho fatto ricerche approfondite, ma sembra che nessuna informazione sia disponibile su come trovare una posizione in elementi HTML (sopra o sotto la vista corrente)

Qualcuno sa qualcosa su questo e può indicarmi la giusta direzione per favore? (sto cercando soluzione C# - WinForms)

Aggiornamento: Grande grazie a John Koerner per il codice. Apprezzo davvero il tempo e gli sforzi che ha messo nel risolvere il mio problema.

E a Jonathan & anche tutti gli altri .. Vorrei poter contrassegnare la risposta di Jonathan anche come risposta, ma consente di contrassegnare come risposta una sola risposta. Il suo commento è stato anche un suggerimento chiaro e utile. Grazie ragazzi siete fantastici !!!

+0

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

+0

WinForms (modificato e aggiunto) –

+0

Se non è visibile, vuoi semplicemente farlo scorrere in vista? In tal caso, puoi utilizzare il metodo ScrollIntoView per visualizzarlo. –

risposta

7

Ok, ho provato questo su google e StackOverflow e sembra funzionare:

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; 
    } 
} 

Poi per usarlo, si chiama semplicemente:

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

wow .. fantastico. Grazie John Koemer. Apprezzo davvero lo sforzo e il tempo che mi hai dedicato. Buona fortuna .. Bene ragazzi, tutti voi siete semplicemente superbi. Molte grazie!!!! –

+0

Hai fatto la mia giornata Grazie John –

3

ho e idea che potrebbe funzionare (mai provato, ma è il meglio che posso offrire a voi, mi dispiace)

È possibile chiamare javascript funzioni nel webbrowsercontrol: LINK

È inoltre possibile crea funzioni javascript che ti danno la posizione di un elemento: LINK

Se si mescolano questi due concetti, è possibile sapere se l'elemento è visibile o meno, come si conosce la dimensione del controllo webbrows.

Nota che è possibile inserire il codice javascript sul webbrowsercontrol. Questo post SO spiega come farlo: LINK

Buona fortuna.

+0

grazie jonathan. Lo proverò sicuramente. Se qualcuno ha una soluzione rapida o un metodo più semplice, non esitare ad aggiungerlo –

+0

Jonahtan, vorrei poter contrassegnare la tua risposta anche come risposta, ma consente di contrassegnare come risposta una sola risposta. Anche il tuo commento è stato chiaro e utile. Hai valutato la tua risposta invece –

+0

Grazie: D Non importa. Siamo qui per aiutare ppl, non per i punti. – Jonathan

Problemi correlati