停止在 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
事件。
OnMouseClick
在 OnClick
之后调用,因此您抑制 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()
在那个上下文中。
问题
默认情况下,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
事件。
OnMouseClick
在 OnClick
之后调用,因此您抑制 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
:
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()
在那个上下文中。