在VB.NET中重定向事件

时间:2010-03-16 15:39:28

标签: vb.net event-handling

我在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上。

1 个答案:

答案 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本身不是私有的,而不是被保护,无论如何它都不能从派生类中使用。