【问题标题】:getting absolute position of HTML element in webbrowser control with C#使用 C# 在 webbrowser 控件中获取 HTML 元素的绝对位置
【发布时间】:2011-08-22 17:10:51
【问题描述】:

我想知道是否可以使用 C# 获取我在 webbrowser 控件中加载的特定 HTML 元素的绝对位置。

我尝试了 .Net 提供的几乎所有选项。 他们都没有给我正确的位置。他们都给我 Y 坐标 0.. 元素肯定不在 0..

有没有人有任何解决方案或想法来解决这个问题?

【问题讨论】:

  • 你想完成什么?一旦真正的问题浮出水面,提供响应就会容易得多。
  • 我想截取特定元素..我需要滚动到指定元素然后设置类似于该元素的网络浏览器控件的宽度+高度..最后截取该元素..

标签: c# html position


【解决方案1】:

这是我目前得到的解决方案:

// 将我们的网络浏览器的大小设置为与图像相同的大小 整数宽度,高度; 宽度 = 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);

完成!

【讨论】:

    【解决方案2】:

    我喜欢以前的答案,但迭代父对象 两次 不是很有效。请记住——您在这里使用的是 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;
    

    【讨论】:

      【解决方案3】:

      谢谢,它就像一个魅力。只好改成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
      

      【讨论】:

        【解决方案4】:

        有一种直接获取坐标的方法。 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;
        

        【讨论】:

          【解决方案5】:

          只是根据我获取绝对定位矩形的需要分享一个稍微不同的实现:

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

          【讨论】:

            【解决方案6】:

            不知道为什么,但不是总是返回 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浏览器位置、菜单空间和边框...

            【讨论】:

              【解决方案7】:

              对我来说最干净的方法如下:

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

              【讨论】:

                猜你喜欢
                • 2012-05-07
                • 1970-01-01
                • 2014-02-23
                • 1970-01-01
                • 2010-10-12
                • 2012-10-28
                • 1970-01-01
                • 2010-09-28
                • 1970-01-01
                相关资源
                最近更新 更多