Как найти положение элемента в элементе управления веб-браузера? - PullRequest
6 голосов
/ 09 февраля 2012

У меня есть форма с контролем веб-браузера, которая загружает веб-страницу (работает нормально, страница загружается нормально)

Теперь моя проблема в том, что я хочу узнать, находится ли конкретная URL-ссылка нижеСверните или выше сгиба (я имею в виду, должен ли пользователь прокручивать страницу вниз, чтобы увидеть эту ссылку, или нет), виден ли этот v без прокрутки, или нам нужно прокрутить, чтобы увидеть его ... Надеюсь, я ясен

Я провел расширенный поиск, но, похоже, нет информации о поиске позиции html-элементов (выше или ниже текущего представления)

Кто-нибудь что-нибудь знает об этом и может указать мне правильное направление, пожалуйста?(Я ищу решение C # - WinForms)

Обновление : Большое спасибо Джону Кернеру за код.Очень ценю время и усилия, которые он вложил в решение моей проблемы.

И Джонатану, и всем остальным тоже ... Хотелось бы пометить ответ Джонатана также как ответ, но он позволяет пометить только один ответ как ответ,Его комментарий был также четким и полезным намеком.Спасибо вам, ребята, здорово !!!

Ответы [ 2 ]

7 голосов
/ 10 февраля 2012

Хорошо, я проверил это на google и stackoverflow, и похоже, что оно работает:

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

Затем, чтобы использовать его, вы просто звоните:

isElementVisible(webBrowser1, "topbar")  //StackOverflow's top navigation bar
3 голосов
/ 09 февраля 2012

У меня есть идея, которая может сработать (никогда не пробовал, но это лучшее, что я могу вам предложить, извините)

Вы можете вызывать функции javascripts в webbrowsercontrol: LINK

Вы также можете создавать функции javascripts, которые определяют положение элемента: LINK

Если вы смешаете эти два понятия, вы можете узнать, является ли элемент видимым илинет, поскольку вы знаете размер элемента управления webbrowser.

Обратите внимание, что вы можете ввести код javascript в элемент управления webbrowser.Этот ТАК пост объясняет, как это сделать: ССЫЛКА

Удачи.

...