MouseLeave .NET UserControl странное поведение - PullRequest
0 голосов
/ 22 марта 2009

У меня есть userControl (.NET 1.1 Winforms), у которого в качестве кнопки есть интерактивное окно рисунка.

Поскольку у меня есть много этих пользовательских элементов управления, видимых одновременно, я подумал, что было бы неплохо, если бы я просто отображал окно с изображением, когда мышь находилась над пользовательским элементом управления, и скрывал его в противном случае.

Для этого я обрабатываю события MouseEnter и MouseLeave в UserControl, скрывая и отображая изображение. Это отлично работает.

Но когда кликабельная картинка отображается, я больше не могу щелкнуть по ней (курсор мыши исчез, а событие щелчка не срабатывает).

После некоторого теста я понимаю, что если прокомментировать все содержимое обработчика MouseLeave, которое что-то делает с моим Picturebox ... таким образом, окно Picturebox активируется.

Я не использую правильное событие?

Есть еще один способ сделать это?

Вот код ...

Private Sub NodoEstablo_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.pictAdd.Visible = False 
End Sub


Private Sub NodoEstablo_MouseEnters(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseEnter        
    Me.pictAdd.Visible = True
End Sub

Обработчик проблемных событий:

Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.MouseLeave
    Me.pictAdd.Visible = False
End Sub

Обновление: Если я изменю размер Picturebox на MouseLeave (просто чтобы сделать что-то), это работает. Пока что изменение Visible и Location в MouseLeave не позволяет мне щелкнуть по картинке. : S

1 Ответ

7 голосов
/ 22 марта 2009

Когда мышь перемещается над вашей кнопкой, происходит что-то похожее на следующее:

  1. Мышь покидает пользовательский контроль (даже если она все еще находится внутри элемента управления) и входит в окно рисунка.
    • Ваш обработчик событий MouseLeave срабатывает, из-за чего картинка не отображается
  2. Поскольку окно рисунка не отображается, мышь покидает поле рисунка и входит в пользовательский контроль
    • Ваш обработчик событий MouseEnter срабатывает, делая изображение видимым
  3. Поскольку изображение теперь отображается, процесс начинается с начала

Когда я проверял ваш код, «кнопка» непрерывно мерцала (поскольку она постоянно переключалась на видимость) и не могла оставаться видимой достаточно долго, чтобы регистрировать любые щелчки.

Один из способов решения этой проблемы - изменить обработчик MouseLeaves так:

Private Sub NodoEstablo_MouseLeaves(ByVal sender As System.Object, _
                                    ByVal e As System.EventArgs) _
                                    Handles MyBase.MouseLeave
    If Not ClientRectangle.Contains(PointToClient(Cursor.Position)) Then
        Me.pictAdd.Visible = False
    EndIf
End Sub

Этот параметр проверяет, действительно ли мышь покинула элемент управления, прежде чем кнопка исчезнет.

Изменение размера коробки рисунка могло нарушить цикл, описанный выше, но это не решает фундаментальную проблему.

Вот некоторые другие вещи (которые не имеют никакого отношения к вашему вопросу):

  • Я думаю, что рекомендуется просто переопределить методы OnMouseLeaves и т. Д. В вашем usercontrol вместо подписки на соответствующие события.
  • Помните, что обработка элементов управления таким способом может сделать невозможным использование вашего приложения только с клавиатуры. (то есть пользователь не может нажать на вашу кнопку и нажать Enter )
...