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