如何在按下键时在鼠标位置设置HtmlElement的样式

问题描述 投票:2回答:1

我在WebBrowser控件的当前文档中有一个TABLE元素。当我按下光标[A Key

时,我希望能够为单元格着色
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

我还能如何实现这一目标?

vb.net winforms webbrowser-control
1个回答
2
投票

需要一些更改:

  • DocumentCompleted事件可用于向其他事件添加处理程序,但您必须记住,此事件被多次引发每个URI导航:您正在向[ C0]事件。在这种情况下,当URI为MouseOver时添加一个处理程序,而当我们将Navigated移至另一个时,将其删除更为简单。另外,请在此处阅读注释:Navigating

  • 代替解析文档中所有元素的集合,我们可以简单地使用How to get an HtmlElement value inside Frames/IFrames?方法,将Document.GetElementFromPoint()e.ClientMousePosition事件提供的MouseOver值作为当前Point位置传递。

  • 当其他控件捕获输入时,即使MouseMove设置为KeyPreview,也不能使用Form的KeyDown事件来捕获按下的键。您可以覆盖该窗体的True,因为它是在对消息进行预处理时调用的。

  • 总是在访问ProcessCmdKey或其属性之前检查null。例如,从未初始化的字符串属性是HtmlElementnull),而不是Nothing

[将此代码添加到表单,然后导航到HTML页面:

String.Empty

我添加了一个切换功能,可以在按下webBrowser1.Navigate("[Some URI]") 时将当前单元格的样式设置为background-color值,并在再次按下时将其设置回。在此,将其硬编码为Keys.A,但是如果需要,您可以添加一些逻辑以保存以前的样式。

white

这是它的工作方式:

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

© www.soinside.com 2019 - 2024. All rights reserved.