2011-05-10 17 views
13

Zastanawiam się, czy możliwe jest uzyskanie absolutnej pozycji konkretnego elementu HTML, który wczytałem do kontroli przeglądarki za pomocą C#.Uzyskanie absolutnej pozycji elementu HTML w kontrolce przeglądarki z C#

Próbowałem prawie wszystkie opcje, które oferuje .Net. żaden z nich nie daje mi prawidłowej pozycji. wszystkie dają mi 0 dla współrzędnej Y. Element zdecydowanie nie jest w 0 ..

Czy ktoś ma jakieś rozwiązanie lub pomysł, aby rozwiązać ten problem?

+0

co chcesz przez to osiągnąć? O wiele łatwiej będzie uzyskać odpowiedź, gdy prawdziwy problem się pojawi. – agradl

+0

Chcę zrobić zrzut ekranu dla określonego elementu .. Muszę przewinąć do określonego elementu, a następnie ustawić szerokość + wysokość kontrolki przeglądarki podobnej do tego elementu .. i na koniec wziąć zrzut ekranu do tego elementu .. – SolidSnake

Odpowiedz

11

tutaj jest rozwiązanie mam tak daleko:

// ustaw wielkość naszej przeglądarce internetowej, aby mieć taki sam rozmiar jak obraz int szerokość, wysokość; width = webBrowser1.Document.Images [0] .ClientRectangle.Width; wysokość = webBrowser1.Document.Images [0] .ClientRectangle.Height;

webBrowser1.Width = width; 
webBrowser1.Height = height; 

//scroll vertically to that element 
webBrowser1.Document.Images[0].OffsetParent.ScrollIntoView(true); 

//calculate x, y offset of the element 
int x = webBrowser1.Document.Images[s].OffsetRectangle.Left + 
webBrowser1.Document.Images[s].OffsetParent.OffsetRectangle.Left + 
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetRectangle.Left+ 
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetParent.OffsetRectangle.Left+ 
webBrowser1.Document.Images[s].OffsetParent.OffsetParent.OffsetParent.OffsetParent.OffsetRectangle.Left; 

int y = webBrowser1.Document.GetElementsByTagName("HTML")[0].ScrollTop; 

//now scroll to that element 
webBrowser1.Document.Window.ScrollTo(x, y); 

teraz ten kod działa idealnie .. ale jest problem z obliczaniu przesunięć. Muszę obliczyć offsetparent elementu, a następnie obliczyć offsetproperties offsetparent itp. Muszę to zrobić dynamicznie, nie dodając go jeden po drugim. Nie wiem jak to zrobić. jakieś pomysły?

EDIT: tutaj jest moja ostatnia i ostateczna wersja i działa z każdym elemencie html znajdzie bezwzględne położenie każdego elementu chcę ..

public int getXoffset(HtmlElement el) 
    { 
     //get element pos 
     int xPos = el.OffsetRectangle.Left; 

     //get the parents pos 
     HtmlElement tempEl = el.OffsetParent; 
     while (tempEl != null) 
     { 
      xPos += tempEl.OffsetRectangle.Left; 
      tempEl = tempEl.OffsetParent; 
     } 

     return xPos; 
    } 

    public int getYoffset(HtmlElement el) 
    { 
     //get element pos 
     int yPos = el.OffsetRectangle.Top; 

     //get the parents pos 
     HtmlElement tempEl = el.OffsetParent; 
     while (tempEl != null) 
     { 
      yPos += tempEl.OffsetRectangle.Top; 
      tempEl = tempEl.OffsetParent; 
     } 

     return yPos; 
    } 

następnie użyć pozycji z:

//now scroll to that element 
webBrowser1.Document.Window.ScrollTo(x, y); 

zrobione!

3

Dziękuję, działa jak urok. Musiałem przerobić go jako VB, i po prostu chcesz podzielić się rozwiązanie:

Function GetXOffSet(ByVal elem As HtmlElement) As Integer 
    Dim xPos As Integer = elem.OffsetRectangle.Left 
    Dim tElm As HtmlElement = elem.OffsetParent 
    Dim trig As Boolean = False 
    While Not trig 
     Try 
      xPos += tElm.OffsetRectangle.Left 
      tElm = tElm.OffsetParent 
     Catch ex As Exception 
      trig = True 
     End Try 
    End While 
    Return xPos 
End Function 

Function GetYOffSet(ByVal elem As HtmlElement) As Integer 
    Dim yPos As Integer = elem.OffsetRectangle.Top 
    Dim tElm As HtmlElement = elem.OffsetParent 
    Dim trig As Boolean = False 
    While Not trig 
     Try 
      yPos += tElm.OffsetRectangle.Top 
      tElm = tElm.OffsetParent 
     Catch ex As Exception 
      trig = True 
     End Try 
    End While 
    Return yPos 
End Function 
4

I jak poprzednie odpowiedzi, ale iteracja rodzica obiektów dwukrotnie nie jest bardzo skuteczne. Pamiętaj - pracujesz z COM/ActiveX tutaj. To działa znacznie szybciej:

public Point GetOffset(HtmlElement el) 
{ 
    //get element pos 
    Point pos = new Point(el.OffsetRectangle.Left, el.OffsetRectangle.Top); 

    //get the parents pos 
    HtmlElement tempEl = el.OffsetParent; 
    while (tempEl != null) 
    { 
     pos.X += tempEl.OffsetRectangle.Left; 
     pos.Y += tempEl.OffsetRectangle.Top; 
     tempEl = tempEl.OffsetParent; 
    } 

    return pos; 
} 

a następnie

var point = GetOffset(element); 
var x = point.X; 
var y = point.Y; 
1

Wystarczy dzielenie nieco inną implementację w oparciu o moje potrzeby, aby uzyskać absolutną pozycjonowania retangle:

public Rectangle GetAbsoluteRectangle(HtmlElement element) { 
    //get initial rectangle 
    Rectangle rect = element.OffsetRectangle; 

    //update with all parents' positions 
    HtmlElement currParent = element.OffsetParent; 
    while (currParent != null) { 
      rect.Offset(currParent.OffsetRectangle.Left, currParent.OffsetRectangle.Top); 
      currParent = currParent.OffsetParent; 
    } 

    return rect; 
} 
0

Nie wiem dlaczego, ale offsetParent nie jest zawsze zwracane (przypadek IE11, obiekt mapy) Musiałem dodać parentElement w pętli, gdy parentOffset nie został podany

While parent IsNot Nothing 
      y += parent.offsetTop 
      x += parent.offsetLeft 
      If parent.offsetParent IsNot Nothing Then 
       parent = parent.offsetParent 
      Else 
       parent = parent.parentElement 
      End If 
    End While 

A trzeba dodać pozycję przeglądarki IE, przestrzeń menu i granic ...

2

Istnieje bezpośredni sposób, aby uzyskać współrzędne.IHTMLElement2 ma metodę getBoundingClientRect, która podaje współrzędne elementu.

IHTMLDocument3 doc = (IHTMLDocument3)this.webbrowser.Document; 
IHTMLElement2 element = (IHTMLElement2)doc.getElementById(idElement); 
IHTMLRect rect = element.getBoundingClientRect(); 

int x = rect.left; 
int y= rect.top; 
0

najczystszy sposób, że pracuje dla mnie jest następująca:

HtmlElement elem = webBrowser.Document.GetElementById(idElement); IHTMLRect rect = ((IHTMLElement2) elem.DomElement).getBoundingClientRect(); // rect.top and rect.left represent absolute coordinates.

Powiązane problemy