Как установить стиль элемента HtmlElement в позиции мыши при нажатии клавиши - PullRequest
2 голосов
/ 20 апреля 2020

У меня есть элемент TABLE в текущем документе элемента управления WebBrowser.
Я хочу иметь возможность закрасить ячейку, когда на нее наведен курсор, когда я нажимаю A Ключ

Private Sub WebBrowser1_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        htmlDocument1 = WebBrowser1.Document
        AddHandler htmlDocument1.MouseOver, AddressOf Me.gettd
End Sub

Public Sub gettd(ByVal sender As Object, ByVal e As System.Windows.Forms.HtmlElementEventArgs)
    Dim theElementCollection As HtmlElementCollection
    theElementCollection = WebBrowser1.Document.GetElementsByTagName("td")
    For Each curElement As HtmlElement In theElementCollection
        e.ToElement.Style = "background-color: orange;"
    Next
End Sub

Настройка KeyPreview = True:

Public Sub Form1_KeyDown(ByVal sender As System.Object, ByVal e As KeyEventArgs) Handles Me.KeyDown
   If e.KeyCode = Keys.A Then
   ...
   end if
End Sub

Как еще можно этого добиться?

1 Ответ

2 голосов
/ 20 апреля 2020

Требуются некоторые изменения:

  • Событие DocumentCompleted можно использовать для добавления обработчиков к другим событиям, но вы должны помнить, что это событие вызывается несколько раз по URI, по которому осуществляется навигация : вы добавляете множество обработчиков к событию MouseOver.
    В этом случае проще добавить обработчик, когда URI был Navigated и удалите его, когда мы перейдем к другому.
    Также прочтите примечания здесь: Как получить значение HtmlElement внутри фреймов / IFrames?

  • Вместо анализа всей коллекции элементов в документе мы можем просто использовать метод Document.GetElementFromPoint () , передав значение e.ClientMousePosition , предоставленное MouseOver или MouseMove события в качестве текущей позиции точки.

  • Событие KeyDown формы нельзя использовать для перехвата нажатых клавиш - даже если KeyPreview установлено в True - когда другие элементы управления захватывают ввод. Вы можете получить нажатие этой клавиши, переопределяя ProcessCmdKey формы, так как она вызывается, когда сообщения предварительно обрабатываются.

  • Всегда проверяйте наличие null перед доступом к HtmlElement или его свойствам. Например, строковые свойства, которые никогда не инициализируются, равны null (Nothing), а не String.Empty.

Добавьте этот код в форму, затем перейдите на страницу Html:

webBrowser1.Navigate("[Some URI]")

Я добавил функцию переключения, чтобы установить текущие ячейки. Введите background-color значение при нажатии Keys.A и установите его обратно при повторном нажатии. Здесь жестко задано значение white, но вы можете добавить некоторые логики c, чтобы сохранить предыдущий стиль, если это необходимо.

Public Class FormBrowser
    Private trackedElement As HtmlElement = Nothing
    Private elementColorOrange As String = "background-color: orange;"
    Private elementColorWhite As String = "background-color: white;"

    Private Sub webBrowser1_Navigating(sender As Object, e As WebBrowserNavigatingEventArgs) Handles webBrowser1.Navigating
        If webBrowser1.Document Is Nothing Then Return
        RemoveHandler webBrowser1.Document.MouseOver, Nothing
    End Sub

    Private Sub webBrowser1_Navigated(sender As Object, e As WebBrowserNavigatedEventArgs) Handles webBrowser1.Navigated
        AddHandler webBrowser1.Document.MouseOver,
            Sub(o, ev)
                Dim doc = webBrowser1.Document
                If doc Is Nothing Then Return
                trackedElement = doc.GetElementFromPoint(ev.ClientMousePosition)
            End Sub
    End Sub

    Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean
        If keyData = Keys.A Then
            If trackedElement IsNot Nothing AndAlso trackedElement.TagName = "TD" Then
                Dim currentStyle As String = trackedElement.Style & ""
                trackedElement.Style = If(currentStyle.Contains(elementColorOrange), elementColorWhite, elementColorOrange)
                Return True
            End If
        End If
        Return MyBase.ProcessCmdKey(msg, keyData)
    End Function
End Class

Вот как это работает:

WebBrowser Track Mouse Position

...