Требуются некоторые изменения:
Событие 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](https://i.stack.imgur.com/0BVrr.gif)