Frage

Ich habe eine benutzerdefinierte Button-Klasse bekommt, dass immer die gleiche Aktion durchführt, wenn es angeklickt wird (ein bestimmtes Fenster zu öffnen). Ich bin ein Click-Ereignis hinzufügen, die wie eine normale Taste in der Schaltfläche XAML, zugeordnet werden können.

Wenn es angeklickt wird, möchte ich den Click-Ereignishandler auszuführen, wenn ein solches zugewiesen wurde, sonst will ich die Standardaktion auszuführen. Das Problem ist, dass es offenbar keine Möglichkeit zu überprüfen, ob alle Handler auf ein Ereignis hinzugefügt wurden.

Ich dachte, einen Null-Check auf dem Fall würde es tun:

if (Click == null) 
{ 
    DefaultClickAction(); 
} 
else 
{ 
    RaiseEvent(new RoutedEventArgs(ClickEvent, this));;
}

... aber das lässt sich nicht kompilieren. Der Compiler sagt mir, dass ich nichts anderes als + = oder tun kann, -. = Auf ein Ereignis außerhalb der definierenden Klasse, Ereignis, obwohl ich versuche, diese Überprüfung INSIDE die definierende Klasse zu tun

Ich habe das richtige Verhalten selbst umgesetzt, aber es ist hässlich und ausführlich und ich kann nicht glauben, dass es keine integrierte Möglichkeit, dies zu tun. Ich muss etwas fehlt werden.

Hier ist der relevante Code:

public class MyButtonClass : Control
{
    //...

    public static readonly RoutedEvent ClickEvent =
        EventManager.RegisterRoutedEvent("Click",
                                         RoutingStrategy.Bubble,
                                         typeof(RoutedEventHandler),
                                         typeof(MyButtonClass));

    public event RoutedEventHandler Click
    {
        add { ClickHandlerCount++; AddHandler(ClickEvent, value); }
        remove { ClickHandlerCount--; RemoveHandler(ClickEvent, value); }
    }

    private int ClickHandlerCount = 0;

    private Boolean ClickHandlerExists
    {
        get { return ClickHandlerCount > 0; }
    }

    //...
}
War es hilfreich?

Lösung

Nein ist es nicht möglich. Eigentlich nimmt der Code, den Sie haben, dass sie das Ereignis auf Ihrer Kontrolle sind Handling selbst, sondern erklären Sie eine Bubble Ereignis nicht ein Direkt Veranstaltung technisch so kann etwas zu der Veranstaltung zu hören ferner wird die Elementkette. Auch technisch braucht man nicht das CLR-Ereignis zu verwenden, um das Ereignis zu Haken; man kann nur die AddHandler Methode direkt in Ihrem Routingereignis vorbei verwenden und das ist, was jemand das Ereignis weiter oben in der Kette tun, müßte Haken. Schließlich das CLR-Ereignis nicht verwendet werden, wenn jemand eine Klasse Handler für das Ereignis registriert (bis benachrichtigt werden, wenn dieses Ereignis für jede Instanz Ihrer MyButtonClass erhöht wird). Wenn man sich so etwas wie die UIElement.BuildRouteHelper schauen, werden Sie alle Schritte sehen, dass WPF die Ereignisroute und die Objekte zu etablieren durchläuft, die aufgerufen wird, wenn das Ereignis ausgelöst wird.

Wenn Sie wirklich müssen wissen, ob es irgendwelche Zuhörer dann sind Sie besser dran mit einem CLR nur Ereignis und keine gerouteten Veranstaltung. Dann können Sie überprüfen, ob Ihre Stellvertretung nicht-null ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top