Freigeben über


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 Handles-Syntax geforderten Instance.Event-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