首页 文章

.NET UserControl的MouseLeave奇怪的行为

提问于
浏览
0

我有一个userControl(.NET 1.1 Winforms),它有一个可点击的图片框作为按钮 .

由于我有很多这些用户控件可以同时显示,我想如果我只是在鼠标悬停在用户控件上时显示图片框而不是隐藏它可能会很好 .

为此,我处理UserControl的MouseEnter和MouseLeave事件,隐藏并显示图片框 . 这很好 .

但是当可点击的图片框可见时,我不再能够点击它(手形光标消失了,并且点击事件没有被触发) .

经过一些测试后,我意识到如果对MouseLeave处理程序中的所有内容进行评论,那些内容与我的图片框有关......这样,图片框就是可点击的 .

I'm not using the correct event?

There's another way to accomplish this?

这是代码......

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 回答

  • 7

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

    • 鼠标离开用户控件(即使它仍在控件内)并进入图片框

    • 您的 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
    

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

    改变图片框的大小可能已经打破了上面概述的周期,但它没有解决根本问题 .

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

    • 我认为建议您只是覆盖usercontrol中的 OnMouseLeaves 等方法,而不是订阅相应的事件 .

    • 请记住,以这种方式处理控件可能会使某人无法仅使用键盘来使用您的应用程序 . (即用户无法按Tab键到按钮并按Enter键)

相关问题