перенаправить событие в VB.NET - PullRequest
2 голосов
/ 16 марта 2010

У меня есть UserControl1 (у меня есть Label1) в Form1. Я хочу перехватить событие MouseDown из Label и отправить его так, как оно было из 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 пользовательский контроль

  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

Одна деталь. Я хочу, чтобы событие было только для метки , а не для всего пользовательского элемента управления.

1 Ответ

3 голосов
/ 16 марта 2010

Почему бы вам не обработать событие «старая школа» и не делегировать его, а создать собственное событие? Вот так:

' 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 сам по себе не является частным, а не защищенным, когда его все равно нельзя использовать из производных классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...