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 ответ
Когда мышь перемещается над вашей кнопкой, происходит что-то похожее на следующее:
- Мышь покидает пользовательский контроль (даже если он все еще находится внутри элемента управления) и входит в окно рисунка.
- Ваш
MouseLeave
обработчик событий срабатывает, делая изображение невидимым
- Ваш
- Поскольку окно рисунка не отображается, мышь покидает поле рисунка и входит в пользовательский контроль
- Ваш
MouseEnter
обработчик событий срабатывает, делая изображение видимым
- Ваш
- Поскольку изображение теперь видно, процесс начинается с начала
Когда я тестировал ваш код, "кнопка" непрерывно мерцала (так как ее видимость постоянно переключалась) и не могла оставаться видимой достаточно долго, чтобы регистрировать любые щелчки.
Одним из способов решения этой проблемы является изменение вашего 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)