2010-03-16 6 views
2

J'ai un UserControl1 (dans lequel j'ai un Label1) dans Form1. Je veux attraper l'événement MouseDown de Label et l'envoyer comme il était de UserControl.rediriger un événement dans VB.NET

je fais:

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 

Cependant, quand je mets dans le 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 

Un détail .. Je veux que l'événement devrait être que sur l'étiquette, non sur l'ensemble de userControl.

Répondre

3

Pourquoi ne pas simplement gérer l'événement «old school» et le déléguer au lieu de créer un événement personnalisé? Comme si:

' In the user control: ' 
Private Sub Label1_MouseDown(sender As Object, e As MouseEventArgs) _ 
     Handles Label1.MouseDown 
    OnMouseDown(e) 
End Sub 

Maintenant, lorsque vous gérez l'événement UserControl.MouseDown dans votre formulaire, l'expéditeur de l'événement sera l'instance de contrôle de l'utilisateur.

Si vous que voulez capturer des clics sur l'étiquette (plutôt que sur le contrôle tout utilisateur), vous pouvez passer outre OnMouseDown à tester d'où le clic provient:

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 

Ce devrait être sûr face aux conditions de course puisqu'il n'y a qu'un seul thread UI. Par ailleurs: RaiseMouseEvent ne peut pas être utilisé ici puisque le premier argument serait la propriété d'événement MouseDown. Toutefois, cette propriété n'est pas accessible à partir des classes dérivées, uniquement dans la classe Control elle-même. Je ne sais pas pourquoi RaiseMouseEvent n'est pas privé lui-même, au lieu d'être protégé, quand il ne peut pas être utilisé à partir de classes dérivées de toute façon.

+0

hmm. Un détail .. Je veux que l'événement devrait être ** seulement sur l'étiquette **, pas sur l'ensemble du contrôle utilisateur – serhio

+0

@serhio: ah. C'est un problème. Mais 'OnMouseDown' est' Overridable' donc vous pouvez fournir votre propre version qui teste un drapeau pour voir d'où l'événement provient. Voir la mise à jour –

+0

est-il un moyen de faire la même chose avec la méthode que j'ai commencé? – serhio

Questions connexes