События Spurrious MouseEnter / MouseLeave в Silverlight 4 TreeView - PullRequest
1 голос
/ 16 сентября 2010

Я пытался использовать событие MouseLeave, чтобы скрыть элемент управления Popup, содержащий объект TreeView. Это не заняло много времени, чтобы наткнуться на первый нюанс, что элемент управления Popup не генерирует событие MouseLeave. Поэтому я пошел с предписанным хакерством и запечатлел события с объекта Child. Тогда я наткнулся на второй нюанс. Событие MouseLeave сработало, как только мышь вошла в элемент управления. Я обнаружил, что элемент управления TreeView генерирует серию чередующихся событий MouseEnter и MouseLeave при входе в объект TreeView.

Следующий код дает подтверждение этому с 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 - проигранная битва. Любые идеи о том, что происходит или что можно сделать, чтобы обойти это?

...