1

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のコントロールを非表示にすることは、負け戦です。何が起こっているのか、それを回避するために何ができるのかについてのアイデアはありますか?

4

0 に答える 0