我想知道是否有可能獲得我用C#加載webbrowser控件的特定HTML元素的絕對位置。獲取HTML元素在webbrowser控件中的絕對位置用C#
我嘗試了幾乎所有的.Net提供的選項.. 沒有一個給我正確的位置。所有他們給我0的Y座標..元素絕對不是在0 ..
有沒有人有任何解決方案或想法來解決這個問題?
我想知道是否有可能獲得我用C#加載webbrowser控件的特定HTML元素的絕對位置。獲取HTML元素在webbrowser控件中的絕對位置用C#
我嘗試了幾乎所有的.Net提供的選項.. 沒有一個給我正確的位置。所有他們給我0的Y座標..元素絕對不是在0 ..
有沒有人有任何解決方案或想法來解決這個問題?
這裏是我到目前爲止的解決方案:
//設置我們的網絡瀏覽器的尺寸是尺寸圖像 INT寬度不變,高度; width = webBrowser1.Document.Images [0] .ClientRectangle.Width; height = 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);
現在這個代碼工作完美..但有一個問題與計算偏移。我需要計算元素的offsetparent,然後計算offsetparent的offsetparent等。我需要動態地不添加它一個接一個..我不知道該怎麼做。有任何想法嗎?
編輯: 這裏是我最後一次和最後的版本,它與任何HTML元素就會找到我想要的任何元素的絕對位置,工程..
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;
}
然後使用位置:
//now scroll to that element
webBrowser1.Document.Window.ScrollTo(x, y);
完成!
謝謝你,它像一個魅力。我不得不重寫它作爲VB,並想和大家分享的解決方案:
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
我喜歡以前的答案,而是通過父對象迭代兩次是不是很有效。記住 - 你在這裏使用COM/ActiveX。這樣更快:
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;
}
然後
var point = GetOffset(element);
var x = point.X;
var y = point.Y;
公正地分享基於我需要一個稍微不同的實現,以獲得絕對定位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;
}
不知道爲什麼,但offsetparent是不是全部返回(IE11,地圖對象的情況下) 我不得不在parentOffset未提供時在循環中添加parentElement
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
而且你需要添加IE瀏覽器的位置,菜單的空間和邊界...
有一個直接的方式來獲得的座標。IHTMLElement2具有方法getBoundingClientRect
,它給出了元素的座標。
IHTMLDocument3 doc = (IHTMLDocument3)this.webbrowser.Document;
IHTMLElement2 element = (IHTMLElement2)doc.getElementById(idElement);
IHTMLRect rect = element.getBoundingClientRect();
int x = rect.left;
int y= rect.top;
爲我的作品最徹底的方法是:
HtmlElement elem = webBrowser.Document.GetElementById(idElement); IHTMLRect rect = ((IHTMLElement2) elem.DomElement).getBoundingClientRect(); // rect.top and rect.left represent absolute coordinates.
什麼是你想實現什麼?一旦真正的問題出現,提供迴應就會變得容易得多。 – agradl 2011-05-10 18:32:22
我想截圖到特定的元素..我需要滾動到指定的元素,然後設置寬度+高度的webbrowser控件類似於該元素..最後採取截圖到該元素.. – SolidSnake 2011-05-10 18:35:18