.NET UserControl 的 MouseLeave 奇怪行为
-
21-08-2019 - |
题
我有一个用户控件(.NET 1.1 Winforms),它有一个可单击的图片框作为按钮。
由于我同时有很多可见的用户控件,因此我认为如果当鼠标位于用户控件上方时显示图片框并在其他情况下隐藏它会很好。
为此,我处理 UserControl 的 MouseEnter 和 MouseLeave 事件,隐藏和显示图片框。效果很好。
但是,当可单击图片框可见时,我无法再单击它(手形光标消失并且单击事件未触发)。
经过一些测试,我意识到如果评论 MouseLeave 处理程序上对我的图片框执行某些操作的所有内容......这样图片框就可以点击了。
我没有使用正确的事件?
还有另一种方法可以实现此目的吗?
这是代码...
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
更新:如果我调整 MouseLeave 上图片框的大小(只是为了做某事),它就会起作用。到目前为止,更改 MouseLeave 中的 Visible 和 Location 阻止我单击图片框。:S
解决方案
当鼠标移到按钮上时,会发生类似于以下内容的情况:
- 鼠标离开用户控件(即使它仍在控件内部)并进入图片框
- 你的
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
这会检查以确保在使按钮消失之前鼠标实际上已离开控件。
更改图片框的大小可能会打破上述循环,但它并不能解决根本问题。
以下是一些需要考虑的其他事项(与您的问题无关):
- 我认为建议您覆盖
OnMouseLeaves
, 等用户控件中的方法,而不是订阅相应的事件。 - 请记住,以这种方式处理控件可能会使其他人无法仅通过键盘使用您的应用程序。(IE。用户不能 标签 到您的按钮并按下 进入)
不隶属于 StackOverflow