我有一个用户控件(.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. 鼠标离开用户控件(即使它仍在控件内部)并进入图片框
    • 你的 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, 等用户控件中的方法,而不是订阅相应的事件。
  • 请记住,以这种方式处理控件可能会使其他人无法仅通过键盘使用您的应用程序。(IE。用户不能 标签 到您的按钮并按下 进入)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top