Почему бы вам не обработать событие «старая школа» и не делегировать его, а создать собственное событие? Вот так:
' 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
Этот должен быть безопасным в условиях гонки, поскольку существует только один поток пользовательского интерфейса.
Кстати: RaiseMouseEvent
здесь не может использоваться, поскольку первый аргумент будет иметь свойство события MouseDown
. Однако к этому свойству нельзя получить доступ из производных классов, только внутри самого класса Control
. Я не знаю, почему RaiseMouseEvent
сам по себе не является частным, а не защищенным, когда его все равно нельзя использовать из производных классов.