MouseLeaveイベントを使用して、TreeViewオブジェクトを含むポップアップコントロールを非表示にしようとしていました。ポップアップコントロールがMouseLeaveイベントを発行しないという、最初のニュアンスに出くわすのにそれほど時間はかかりませんでした。そこで、規定のハックアラウンドを使用して、Childオブジェクトからイベントをキャプチャしました。それから私は2番目のニュアンスに出くわしました。MouseLeaveイベントは、マウスがコントロールに入るとすぐに発生していました。TreeViewオブジェクトに入ると、TreeViewコントロールが一連の交互のMouseEnterイベントとMouseLeaveイベントを発行していることを発見しました。
次のコードは、IE8でこれの証拠を生成します。
Public Class MainApp
Inherits Application
Dim _cnt As Integer = 1
Public Sub New()
AddHandler Me.Startup, AddressOf HandleStartup
End Sub
Private Sub HandleStartup()
Dim tv As New TreeView
AddHandler tv.MouseEnter, AddressOf HandleMouseEnter
AddHandler tv.MouseLeave, AddressOf HandleMouseLeave
RootVisual = tv
End Sub
Private Sub HandleMouseEnter(ByVal sender As Object, ByVal ev As MouseEventArgs)
System.Diagnostics.Debugger.Log(0, Nothing, "MouseEnter " & _cnt & vbCrLf)
_cnt += 1
End Sub
Private Sub HandleMouseLeave(ByVal sender As Object, ByVal ev As MouseEventArgs)
System.Diagnostics.Debugger.Log(0, Nothing, "MouseLeave " & _cnt & vbCrLf)
_cnt += 1
End Sub
End Class
私が見ると期待する場所
MouseEnter 1
...
MouseLeave 2
代わりに私は見る
MouseEnter 1
MouseLeave 2
MouseEnter 3
...
MouseLeave 4
したがって、MouseLeaveのコントロールを非表示にすることは、負け戦です。何が起こっているのか、それを回避するために何ができるのかについてのアイデアはありますか?