Visual Basic- und WPF-Ereignisbehandlung
Für die Microsoft Visual Basic .NET-Sprache können Sie das sprachspezifische Handles-Schlüsselwort verwenden, um Instanzen Ereignishandler zuzuordnen, anstatt Ereignishandlern Attribute anzufügen oder die AddHandler-Methode zu verwenden. Das Handles-Verfahren für das Anfügen von Handlern an Instanzen unterliegt jedoch einigen Einschränkungen, da die Handles-Syntax einige der spezifischen Routingereignis-Features des WPF-Ereignissystems nicht unterstützen kann.
Verwenden von "Handles" in einer WPF-Anwendung
Die Ereignishandler, die über Handles mit Instanzen und Ereignissen verbunden sind, müssen alle innerhalb der partiellen Klassendeklaration der Instanz definiert sein. Dies gilt auch für Ereignishandler, die über Attributwerte für Elemente zugewiesen sind. Sie können nur Handles für ein Element auf einer Seite angeben, das einen Name-Eigenschaftswert hat (oder für das x:Name-Direktive deklariert ist). Das liegt daran, dass die Name-Eigenschaft in XAML den Instanzverweis erstellt, der erforderlich ist, um das durch die Handles-Syntax geforderte Instance.Event-Verweisformat zu unterstützen. Das einzige Element, das für Handles ohne einen Name-Verweis verwendet werden kann, ist die Stammelementinstanz, die die partielle Klasse definiert.
Sie können mehreren Elementen den gleichen Handler zuweisen, indem Sie Instance.Event-Verweise nach Handles durch Kommas trennen.
Sie können Handles verwenden, um dem gleichen Instance.Event-Verweis mehrere Handler zuzuweisen. Die Reihenfolge, in der die Handler im Handles-Verweis angegeben sind, spielt keine Rolle. Sie sollten davon ausgehen, dass Handler, die dasselbe Ereignis behandeln, in beliebiger Reihenfolge aufgerufen werden können.
Um einen Handler zu entfernen, der mit Handles in der Deklaration hinzugefügt wurde, können Sie RemoveHandler aufrufen.
Sie können Handles verwenden, um Handler für Routingereignisse anzufügen, solange Sie Handler an Instanzen anfügen, die das zu behandelnde Ereignis in ihren Membertabellen definieren. Für Routingereignisse beachten Handler, die mit Handles angefügt sind, dieselben Routingregeln wie Handler, die als XAML-Attribute oder mit der AddHandler-Common-Signatur angefügt werden. Wenn das Ereignis bereits als behandelt markiert ist (die Handled-Eigenschaft in den Ereignisdaten ist True), werden Handler, die mit Handles angefügt sind, nicht als Reaktion auf diese Ereignisinstanz aufgerufen. Das Ereignis könnte durch Instanzhandler für andere Elemente auf der Route oder durch die Klassenbehandlung des aktuellen Elements oder eines früheren Elements auf der Route als behandelt markiert werden. Bei Eingabeereignissen, die Tunneling-Bubbling-Ereignispaare unterstützen, kann die Tunneling-Route das Ereignispaar als behandelt markiert haben. Weitere Informationen zu Routingereignissen finden Sie unter Übersicht über Routingereignisse.
Einschränkungen für "Handles" beim Hinzufügen von Handlern
Handles können nicht auf Handler für angefügte Ereignisse verweisen. Für das angefügte Ereignis müssen die add-Accessormethode oder typename.eventname-Ereignisattribute in XAML verwendet werden. Ausführliche Informationen finden Sie unter Übersicht über Routingereignisse.
Für Routingereignisse können Sie nur Handles verwenden, um Handler für Instanzen zuzuweisen, wenn das Ereignis in der Instanzmembertabelle vorhanden ist. Bei Routingereignissen im Allgemeinen kann jedoch ein übergeordnetes Element als Listener für Ereignisse aus untergeordneten Elementen fungieren, auch wenn das übergeordnete Element dieses Ereignis nicht in seiner Membertabelle hat. In der Attributsyntax können Sie dies über eine typename.membername-Attributform angeben, die festlegt, welcher Typ tatsächlich das Ereignis definiert, das Sie behandeln möchten. So kann beispielsweise eine übergeordnete Page (für die kein Click-Ereignis definiert ist) Klickereignisse der Schaltflächen überwachen, indem ein Attributhandler in der Button.Click-Form zugewiesen wird. Handles unterstützt jedoch die typename.membername-Form nicht, da es eine Instance.Event-Form unterstützen muss, das im Konflikt dazu steht. Ausführliche Informationen finden Sie unter Übersicht über Routingereignisse.
Handles können keine Handler anfügen, die für Ereignisse aufgerufen werden, die bereits als behandelt gekennzeichnet sind. Stattdessen müssen Sie Code verwenden und die handledEventsToo-Überladung von AddHandler(RoutedEvent, Delegate, Boolean) aufrufen.
Hinweis |
---|
Verwenden Sie die Handles-Syntax nicht im Visual Basic-Code, wenn Sie einen Ereignishandler für das gleiche Ereignis in XAML angeben.In diesem Fall wird der Ereignishandler zweimal aufgerufen. |
Implementieren der "Handles"-Funktionalität in WPF
Wenn eine Extensible Application Markup Language (XAML)-Seite kompiliert wird, deklariert die Zwischendatei Friend WithEvents-Verweise für jedes Element einer Seite, für das eine Name-Eigenschaft festgelegt wurde (oder für das x:Name-Direktive deklariert wurde). Jede benannte Instanz ist potenziell ein Element, das über Handles einem Handler zugewiesen werden kann.
Hinweis |
---|
Innerhalb von Microsoft Visual Studio kann IntelliSense den Abschluss für die Elemente zeigen, die für einen Handles-Verweis in einer Seite verfügbar sind.Dies kann jedoch einen Kompilierungsschritt in Anspruch nehmen, da die Zwischendatei alle Friends-Verweise ausfüllen muss. |
Siehe auch
Referenz
Konzepte
Markieren von Routingereignissen als behandelt und Klassenbehandlung