MouseLeave.NET UserControl странное поведение

У меня есть 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 ответ

Решение

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

  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

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

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

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

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