2017-06-26 1 views
1

Ich habe dies in vielen Antworten gesehen, und ich kann nicht herausfinden, wie es funktioniert.WPF RemoveHandler mit einem neuen Handler

Es geht in der Regel auf diese Weise (Pseudo-Code):

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

die im Grunde eine neue Instanz eines Delegaten schafft so scheint es, und übergeben, so dass es zu einer Liste der Delegierten hinzugefügt wird. So weit, ist es gut.

Aber dann, es zu entfernen, was Sie tun:

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

die gerade eine neue Instanz zu entfernen scheint, nicht die vorherige.

Was geht hier vor?

Antwort

2

Sie können keinen Verweis auf eine neue EventHandler übergeben, auf die Sie keinen Bezug halten, wenn Sie sie später entfernen möchten.

Cast't-Handler zum entsprechenden Delegattyp.

Dies funktioniert, das heißt der Event-Handler nur einmal aufgerufen wird, wenn die Button geklickt wird:

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" /> 
Verwandte Themen