我在UserControl1
中有一个Label1
(女巫我有一个Form1
)。我想从Label中捕获MouseDown
事件并将其发送为来自UserControl。
我做:
Public Class UserControl1
Shadows Custom Event MouseDown As MouseEventHandler
AddHandler(ByVal value As MouseEventHandler)
AddHandler Label1.MouseDown, value
End AddHandler
RemoveHandler(ByVal value As MouseEventHandler)
RemoveHandler Label1.MouseDown, value
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As MouseEventArgs)
'RaiseMouseEvent(Me, e) ??? '
End RaiseEvent
End Event
End Class
但是,当我在Form1中设置UserControl
时 Private Sub UserControl11_MouseDown(ByVal sender As System.Object, _
ByVal e As System.Windows.Forms.MouseEventArgs) _
Handles UserControl11.MouseDown
' here I have "Label", BUT want "UserControl" '
MessageBox.Show(sender.GetType.Name)
End Sub
一个细节..我希望事件应该只在标签上 ,而不是在整个userControl上。
答案 0 :(得分:3)
为什么不直接处理事件“旧学校”并委托它,而不是创建自定义事件?像这样:
' In the user control: '
Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs) _
Handles Label1.MouseDown
OnMouseDown(e)
End Sub
现在,当您处理表单中的UserControl.MouseDown
事件时,事件的发件人将成为用户控件实例。
如果仅想要捕获标签上的点击(而不是整个用户控件),那么您可以覆盖OnMouseDown
来测试点击源自哪里:
Private m_MouseDownFromLabel As Boolean = False
Private Sub Label1_MouseDown(ByVal sender As Object, ByVal e As MouseEventArgs) _
Handles Label1.MouseDown
m_MouseDownFromLabel = True
OnMouseDown(e)
End Sub
Protected Overrides Sub OnMouseDown(ByVal e As MouseEventArgs)
If m_MouseDownFromLabel Then
m_MouseDownFromLabel = False
MyBase.OnMouseDown(e)
End If
End Sub
这个应该在面对竞争条件时是安全的,因为只有一个UI线程。
顺便说一句:RaiseMouseEvent
不能在这里使用,因为第一个参数将是MouseDown
事件属性。但是,只能在Control
类本身内部从派生类访问此属性。我不知道为什么RaiseMouseEvent
本身不是私有的,而不是被保护,无论如何它都不能从派生类中使用。