2011-01-26 3 views
0

J'ai un ensemble personnalisé de UserControls: NavigationBar et NavigationItem.Comment créer un événement personnalisé?

Je voudrais que chaque fois que l'utilisateur clique n'importe où dans le NavigationItem, un événement est déclenché. Je ne sais pas comment mettre ça en place.

http://i.stack.imgur.com/ocP2D.jpg

J'ai essayé ceci:

public partial class NavigationBar : UserControl 
{ 
    public NavigationBar() 
    { 
     InitializeComponent(); 
     SetupEvents(); 
    } 

    public List<NavigationItem> NavigationItems { private get; set; } 
    public NavigationItem SelectedItem { get; set; } 

    private void SetupEvents() 
    { 
     navigationItem1.Click += new EventHandler(navigationItemClick); 
    } 

    void navigationItemClick(object sender, EventArgs e) 
    { 
     MessageBox.Show("Clicked on " + sender.ToString()); 
    } 
} 

Mais cet événement ne se déclenche que lorsque l'utilisateur clique spécifiquement sur le contrôle NavigationItem, mais pas quand il clique sur l'image ou du texte. (Ce sont PictureBox et Label).

Quel serait le meilleur plan d'action? Je voudrais créer quelque chose de bien, pas de code hacky. Merci!

Répondre

2

Mettez quelque chose comme ceci dans votre classe:

public event EventHandler NavigationItemClick; 

Cela crée un nouvel événement dans votre classe nommée NavigationItemClick. Le concepteur de formulaire va même le voir.

Dans votre méthode navigationItemClick, vous pouvez le faire pour appeler l'événement.

EventHandler handler = this.NavigationItemClick; 
if (handler != null) 
{ 
    handler(this, EventArgs.Empty); 
} 

Il est important d'enregistrer l'événement dans la variable handler pour éviter les conditions de course. EventHandler est un délégué, donc vous l'appelez comme une méthode, d'où la ligne dans l'instruction if. Le if lui-même s'assure que quelqu'un a attaché à votre événement.

+0

Dans quelle classe puis-je créer ce nouvel événement? –

+0

J'ai ajouté EventHandler dans la classe NavigationItem.cs et le concepteur de formulaire ne trouve pas cet événement particulier. Aucune suggestion? –

+0

@Sergio: Vous pouvez attacher le gestionnaire d'événements dans le code derrière. –

Questions connexes