2017-06-26 1 views
1

J'ai vu cela dans beaucoup de réponses, et je ne peux pas comprendre comment cela fonctionne.WPF RemoveHandler avec un nouveau gestionnaire

Il va généralement de cette façon (pseudo-code):

UIElement.AddHandler(routedEvent, new EventHandler(handler)); 

qui semble essentiellement à crée une nouvelle instance d'un délégué et le transmettre afin qu'il soit ajouté à la liste des délégués. Jusqu'ici tout va bien.

Mais, pour l'enlever, vous faire:

UIElement.RemoveHandler(routedEvent, new EventHandler(handler)); 

qui vient semble pour enlever une nouvelle instance, pas le précédent.

Que se passe-t-il ici?

Répondre

2

Vous ne pouvez pas transmettre une référence à un nouveau EventHandler auquel vous ne gardez aucune référence si vous souhaitez pouvoir le supprimer plus tard.

Distribuez le gestionnaire au type de délégué approprié.

Cela fonctionne, à savoir le gestionnaire d'événements n'est invoquée une fois lorsque le Button clique sur:

code:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     btn.AddHandler(Button.ClickEvent, (RoutedEventHandler)OnClick); 
    } 

    private void OnClick(object sender, RoutedEventArgs e) 
    { 
     MessageBox.Show("click"); 
     btn.RemoveHandler(Button.ClickEvent, (RoutedEventHandler)OnClick); 
    } 
} 

XAML:

<Button x:Name="btn" Content="Button" />