停止在 UserControl 的特定区域引发 Click 事件

Stop raising Click Event in a specific area of a UserControl

问题

默认情况下,UserControl 在按下鼠标按钮时引发 Click 事件。有没有一种方法可以防止在单击 UserControl 的特定区域时引发事件?

代码

假设我们有这个特定的 UserControl。有一个红色矩形:我只想在白色区域引发点击事件。
我试图覆盖 OnMouseClick sub:

Public Class UserControl1

    Dim noClickArea As New Rectangle(100, 100, 50, 50)

    'Draw the red rectangle
    Private Sub UserControl1_Paint(sender As Object, e As PaintEventArgs) Handles MyBase.Paint
        Using gr As Graphics = Me.CreateGraphics
            gr.Clear(Color.White)
            gr.FillRectangle(Brushes.Red, noClickArea)
        End Using
    End Sub

    'This aims to prevent the mouseClick event on noClickArea
    Protected Overrides Sub OnMouseClick(e As MouseEventArgs)
        If Not noClickArea.Contains(e.Location) Then
            MyBase.OnMouseClick(e)
        End If
    End Sub

End Class

这是一个使用此 UserControl 并在单击时显示消息框的测试窗体:

Public Class Form1

    Private Sub UserControl11_Click(sender As Object, e As EventArgs) Handles UserControl11.Click
        MessageBox.Show("Click")
    End Sub
End Class

结果

覆盖 OnMouseClick 没有产生预期的结果:

怎样才能达到我想要的结果?

您正在覆盖 OnMouseClick,但您已订阅表单中的 Click 事件。
OnMouseClickOnClick 之后调用,因此您抑制 MouseClick,但 Click 事件已经引发。
改写 OnClick。或者在您的表单中订阅 MouseClick 活动。

注意OnClick方法的EventArgs实际上是一个MouseEventArgs对象,所以可以将EventArgs转换为MouseEventArgs:

Protected Overrides Sub OnClick(e As EventArgs)
    If Not noClickArea.Contains(CType(e, MouseEventArgs).Location) Then
        MyBase.OnClick(e)
    End If
End Sub

然后,覆盖 OnPaint 而不是订阅 UserControl 中的 Paint 事件。
另外,不要在该事件或方法重写中使用 Me.CreateGraphics,它没有意义。
使用 PaintVentArgs:

提供的 Graphics 对象
Protected Overrides Sub OnPaint(e As PaintEventArgs)
    e.Graphics.Clear(Color.White)
    e.Graphics.FillRectangle(Brushes.Red, noClickArea)
    MyBase.OnPaint(e)
End Sub

作为一个建议(因为我不知道真正的用例是什么),如果你想用一种颜色填充整个控件的背景,请在设计器中设置控件的背景颜色,而不是使用 Graphics.Clear() 在那个上下文中。