Visual Basic- und WPF-Ereignisbehandlung
Insbesondere für die Sprache Microsoft Visual Basic .NET können Sie die sprachspezifischen Handles
-Schlüsselwörter dazu verwenden, um Ereignishandler mit Instanzen zu verknüpfen, anstatt Ereignishandlern Attribute anzufügen oder die AddHandler-Methode zu verwenden. Allerdings weist die Handles
-Technik für das Anfügen von Handlern an Instanzen einige Einschränkungen auf, da die Handles
-Syntax einige der spezifischen Funktionen von Routingereignissen des WPF-Ereignissystems nicht unterstützt.
Verwenden von „Handles“ in einer WPF-Anwendung
Die Ereignishandler, die über Handles
mit Instanzen und Ereignissen verbunden sind, müssen alle innerhalb der partiellen Klassendefinition der Instanz definiert sein, die auch eine Anforderung für Ereignishandler darstellt, die über Attributwerte für Elemente zugewiesen werden. Sie können Handles
nur für ein Element auf der Seite angeben, das über einen Name-Eigenschaftenwert verfügt (oder x:Name Directive deklariert). Grund hierfür ist, dass der Name in XAML den Instanzverweis erstellt, der zur Unterstützung des von der -Syntax geforderten Handles
-Referenzformats erforderlich ist. 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 Elemente den gleichen Handler zuweisen, indem Sie Instance.Event-Verweise nach Handles
durch Kommas trennen.
Sie können Handles
dazu nutzen, um dem gleichen Instance.Event-Verweis mehr als einen Handler zuzuweisen. Bemessen Sie der Reihenfolge, in der Handler im Handles
-Verweis gegeben werden, keine Wichtigkeit zu. Sie können davon ausgehen, dass Handler, die dasselbe Ereignis behandlen, in beliebiger Reihenfolge aufgerufen werden können.
Um einen Ereignishandler zu entfernen, der mit Handles
zur Deklaration hinzugefügt wurde, können Sie RemoveHandler aufrufen.
Mithilfe von Handles
können Sie Handler für Routingereignisse anfügen, solange Sie Handler an Instanzen anfügen, die das behandelte Ereignis in ihren Membertabellen definieren. Handler, die mit Handles
angefügt wurden, befolgen für Routingereignisse dieselben Routingregeln wie Handler, die als XAML-Attribute oder mit der gemeinsamen Signatur von AddHandler angefügt wurden. Dies bedeutet, dass wenn das Ereignis bereits als behandelt markiert ist (die Handled-Eigenschaft in den Ereignisdaten entspricht True
), dass mit Handles
angefügte Handler dann nicht als Antwort auf diese Ereignisinstanz aufgerufen werden. Das Ereignis kann von Instanzhandlern auf ein anderes Element in der Route oder von der Klassenbehandlung für das aktuelle Element oder frühere Elemente entlang der Route als behandelt markiert werden. Für Eingabeereignisse, die gekoppelte Tunneling-/Bubblingereignisse unterstützen, kann die Tunnelingroute das Ereignispaar als behandelt markiert haben. Weitere Informationen zu Routingereignissen finden Sie unter Übersicht über Routingereignisse.
Einschränkungen von „Handles“ beim Hinzufügen von Handlern
Handles
kann für angefügte Ereignisse nicht auf Handler verweisen. Verwenden Sie die add
-Zugriffsmethode für das angefügte Ereignis oder typename.eventname-Ereignisattribute in XAML. Weitere Informationen finden Sie unter Übersicht über Routingereignisse.
Für Routingereignisse können Sie nur Handles
dazu verwenden, um Handler für Instanzen zuzuweisen, auf denen das Ereignis in der Instanzmembertabelle vorhanden ist. Mit Routingereignissen kann ein übergeordnetes Element aber im Allgemeinen ein Listener für ein Ereignis aus untergeordneten Elementen sein, selbst wenn dieses Ereignis nicht in der Membertabelle des übergeordneten Elements vorkommt. In der Attributsyntax können Sie dies über die typename.membername-Attributform angeben, die beschreibt, welcher Typ tatsächlich das zu behandlende Ereignis definiert. Ein übergeordnetes Page
(für das kein Click
-Ereignis definiert ist) kann Klickereignisse überwachen, indem ein Attributhandler in Form von Button.Click
zugewiesen wird. Handles
unterstützt aber nicht die Form typename.membername, da es eine in Konflikt stehende Instance.Event-Form unterstützen muss. Weitere Informationen finden Sie unter Übersicht über Routingereignisse.
Handles
kann keine Handler anfügen, die für Ereignisse aufgerufen werden, die bereits als behandelt markiert sind. Stattdessen müssen Sie Code verwenden und die handledEventsToo
-Überladung von AddHandler(RoutedEvent, Delegate, Boolean) aufrufen.
Hinweis
Verwenden Sie nicht die Handles
-Syntax in Visual Basic-Code, wenn Sie einen Ereignishandler für das gleiche Ereignis in XAML angeben. In diesem Fall wird der Ereignishandler zweimal aufgerufen.
So implementiert WPF die „Handles“-Funktionalität
Wenn eine XAML-Seite (Extensible Application Markup Language) kompiliert wird, deklariert die Zwischendatei Friend
WithEvents
-Verweise auf jedes Element auf der Seite, die einen Name-Eigenschaftensatz aufweist (oder x:Name Directive deklariert). Jede benannte Instanz ist potenziell ein Element, das an einem Handler mit Handles
zugewiesen werden kann.
Hinweis
In Visual Studio kann IntelliSense Ihnen eine Auto-Vervollständigung für alle Elemente anbieten, die für einen Handles
-Verweis verfügbar sind. Dies kann jedoch einen Kompilierungsschritt dauern, sodass die Zwischendatei alle Friends
-Verweise auffüllen kann.
Weitere Informationen
.NET Desktop feedback