.NET UserControl的MouseLeave奇怪的行为

时间:2009-03-22 16:16:13

标签: .net vb.net winforms mouseleave

我有一个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

1 个答案:

答案 0 :(得分:7)

当鼠标移动到按钮上时,会出现类似以下情况:

  1. 鼠标离开用户控件(即使它仍在控件内)并进入图片框
    • 您的MouseLeave事件处理程序触发,使图片框不可见
  2. 由于图片框不可见,鼠标离开图片框并进入用户控件
    • 您的MouseEnter事件处理程序触发,使图片框可见
  3. 因为现在可以看到图片框,所以该过程从头开始
  4. 当我测试你的代码时,“按钮”不断地闪烁(因为它保持其可见性切换)并且无法保持足够长的时间来记录任何点击。

    解决此问题的一种方法是将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
    

    这会检查以确保鼠标实际上已经离开控件,然后按钮消失。

    更改图片框的大小可能会破坏上面概述的周期,但它没有解决根本问题。

    以下是一些需要考虑的其他事情(与您的问题无关):

    • 我认为建议您只是覆盖usercontrol中的OnMouseLeaves等方法,而不是订阅相应的事件。
    • 请记住,以这种方式处理控件可能会使某人无法仅使用键盘来使用您的应用程序。 (即用户不能 Tab 到您的按钮并按 Enter