【问题标题】:.NET UserControl's MouseLeave strange behavior.NET UserControl 的 MouseLeave 奇怪行为
【发布时间】:2009-03-22 16:16:13
【问题描述】:

我有一个用户控件(.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

【问题讨论】:

    标签: .net vb.net winforms mouseleave


    【解决方案1】:

    当鼠标移到您的按钮上时,会发生类似以下情况:

    1. 鼠标离开用户控件(即使它仍在控件内)并进入图片框
      • MouseLeave 事件处理程序触发,使图片框不可见
    2. 由于图片框不可见,鼠标离开图片框进入用户控件
      • MouseEnter 事件处理程序触发,使图片框可见
    3. 因为图片框现在可见,所以过程从头开始

    当我测试您的代码时,“按钮”不断闪烁(因为它的可见性一直处于切换状态)并且无法保持足够长的可见性以记录任何点击。

    解决此问题的一种方法是将您的 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等方法,而不是订阅相应的事件。
    • 请记住,以这种方式处理控件会使某人无法仅通过键盘使用您的应用程序。 (即用户不能 Tab 到您的按钮并按 Enter

    【讨论】:

    • 我怀疑发生了这样的事情,所以我在计时器内执行隐藏逻辑......当鼠标离开时启动计时器并在隐藏按钮后停止它。现在我可以摆脱计时器了...非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-15
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    相关资源
    最近更新 更多