我有一个userControl(.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
usercontrol中的etc等方法,而不是订阅相应的事件.
请记住,以这种方式处理控件可能会使某人无法仅使用键盘来使用您的应用程序.(即用户无法Tab按下按钮并按下Enter)