0

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

4

1 回答 1

7

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

  1. 鼠标离开用户控件(即使它仍在控件内)并进入图片框
    • 您的MouseLeave事件处理程序触发,使图片框不可见
  2. 因为picturebox不可见,鼠标离开picturebox进入usercontrol
    • 您的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用户控件中的 , etc 方法,而不是订阅相应的事件。
  • Remember that handling controls this way can make it impossible for someone to use your application with a keyboard only. (i.e. the user can't Tab to your button and press Enter)
于 2009-03-22T19:09:26.173 回答