2012-02-09 71 views
6

Tôi có biểu mẫu với điều khiển trình duyệt web, tải trang web (hoạt động tốt, trang tải ok)Cách tìm vị trí của một phần tử trong Điều khiển Trình duyệt Web?

Vấn đề của tôi là, tôi muốn tìm xem liệu một liên kết url cụ thể có dưới màn hình đầu tiên hay cao hơn nếp gấp (i có nghĩa là, cho dù người dùng phải cuộn xuống để xem liên kết này, hay không) liệu v này có thể nhìn thấy với ra di chuyển hoặc chúng ta cần phải di chuyển để xem nó .. tôi hy vọng tôi rõ ràng

tôi đã thực hiện tìm kiếm mở rộng, nhưng có vẻ như không có thông tin nào về vị trí các phần tử html (phía trên hoặc bên dưới chế độ xem hiện tại)

Có ai không biết điều gì đó về điều này và có thể chỉ cho tôi đi đúng hướng không? (tôi đang tìm giải pháp C# - WinForms)

Cập nhật: Big nhờ John Koerner cho mã. Thực sự đánh giá cao thời gian và nỗ lực của anh ấy trong việc giải quyết vấn đề của tôi.

Và để Jonathan & mọi người khác cũng .. Tôi ước tôi có thể đánh dấu Jonathans cũng trả lời là câu trả lời, nhưng nó chỉ cho phép một câu trả lời được đánh dấu là câu trả lời. Nhận xét của ông cũng là gợi ý rõ ràng và hữu ích. Cảm ơn các bạn rất tuyệt !!!

+0

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

+0

WinForms (đã chỉnh sửa và thêm) –

+0

Nếu nó không hiển thị, bạn có muốn cuộn nó vào chế độ xem không? Nếu vậy, bạn có thể sử dụng phương thức ScrollIntoView để hiển thị nó. –

Trả lời

7

Ok, tôi đã thử nghiệm này trên google và stackoverflow và nó dường như làm việc:

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

Sau đó, để sử dụng nó, bạn chỉ cần gọi:

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

wow .. tuyệt vời. Cảm ơn John Koemer .. Thực sự đánh giá cao nỗ lực và thời gian bạn đã giúp đỡ tôi. Tốt nhất của may mắn .. Vâng guys, tất cả các bạn chỉ đơn giản là tuyệt vời. Cảm ơn rất nhiều!!!! –

+0

Bạn đã làm Ngày của tôi Cảm ơn John –

3

Tôi có và ý tưởng rằng có thể làm việc (không bao giờ thử nó, nhưng đó là tốt nhất mà tôi có thể cung cấp cho bạn, xin lỗi)

Bạn có thể gọi javascripts chức năng trong webbrowsercontrol: LINK

Bạn cũng có thể tạo các hàm javascripts cung cấp cho bạn vị trí của một phần tử: LINK

Nếu bạn kết hợp hai khái niệm này, bạn có thể biết phần tử có hiển thị hay không, như bạn biết kích thước của webbrowsercontrol.

Lưu ý rằng bạn có thể tiêm mã javascript vào webbrowsercontrol. Bài đăng SO này giải thích cách thực hiện: LINK

Chúc may mắn.

+0

cảm ơn bạn jonathan. Tôi chắc chắn sẽ thử nó. Nếu bất kỳ ai có phương pháp sửa chữa nhanh hoặc đơn giản hơn, xin đừng ngần ngại thêm nó –

+0

Jonahtan, tôi ước tôi có thể đánh dấu câu trả lời của bạn cũng như câu trả lời, nhưng nó chỉ cho phép một câu trả lời được đánh dấu là câu trả lời. Nhận xét của bạn cũng là gợi ý rõ ràng và hữu ích. Đã trả lời câu trả lời của bạn thay vì câu trả lời là –

+0

Cảm ơn: D Nó không quan trọng. Chúng tôi đang ở đây để giúp đỡ ppl, không phải cho các điểm. – Jonathan

Các vấn đề liên quan