Übersicht über angefügte EreignisseAttached Events Overview

Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) definiert eine Sprachkomponente und einen Ereignistyp mit der Bezeichnung angefügtes Ereignis.defines a language component and type of event called an attached event. Mit dem Konzept eines angefügten Ereignisses können Sie einen Handler für ein bestimmtes Ereignis zu einem beliebigen Element und nicht zu einem Element, das tatsächlich das Ereignis definiert oder erbt, hinzufügen.The concept of an attached event enables you to add a handler for a particular event to an arbitrary element rather than to an element that actually defines or inherits the event. In diesem Fall definiert oder „besitzt“ weder das Objekt, das potenziell das Ereignis auslöst, noch die Instanz der Richtungsbehandlung das Ereignis.In this case, neither the object potentially raising the event nor the destination handling instance defines or otherwise "owns" the event.

VorraussetzungenPrerequisites

In diesem Thema wird davon ausgegangen, dass Sie die Artikel Übersicht über Routingereignisse und Übersicht über XAML (WPF) gelesen haben.This topic assumes that you have read Routed Events Overview and XAML Overview (WPF).

Syntax der angefügten EreignisseAttached Event Syntax

Angefügte Ereignisse haben eine XAMLXAML-Syntax und ein Codierungsmuster, die von zugrunde liegendem Code verwendet werden müssen, damit die Verwendung angefügter Ereignisse unterstützt wird.Attached events have a XAMLXAML syntax and a coding pattern that must be used by the backing code in order to support the attached event usage.

In der XAMLXAML-Syntax wird das angefügte Ereignis nicht einfach durch seinen Ereignisnamen, sondern durch seinen besitzenden Typ plus dem Ereignisnamen, getrennt durch einen Punkt (.) angegeben.In XAMLXAML syntax, the attached event is specified not just by its event name, but by its owning type plus the event name, separated by a dot (.). Da der Name des Ereignisses mit dem Namen des besitzenden Typs qualifiziert wird, ermöglicht es die Syntax der angefügten Ereignisse jedem angefügten Ereignis an jedes Element angefügt zu werden, die instanziiert werden können.Because the event name is qualified with the name of its owning type, the attached event syntax allows any attached event to be attached to any element that can be instantiated.

Folgendes ist z.B. die XAMLXAML-Syntax für das Anfügen eines Handlers für ein benutzerdefiniertes angefügtes Ereignis NeedsCleaning:For example, the following is the XAMLXAML syntax for attaching a handler for a custom NeedsCleaning attached event:

<aqua:Aquarium Name="theAquarium" Height="600" Width="800" aqua:AquariumFilter.NeedsCleaning="WashMe"/>

Beachten Sie das aqua:-Präfix. Das Präfix ist in diesem Fall erforderlich, da das angefügte Ereignis ein benutzerdefiniertes Ereignis ist, das aus einer benutzerdefinierten zugeordneten xmlns stammt.Note the aqua: prefix; the prefix is necessary in this case because the attached event is a custom event that comes from a custom mapped xmlns.

So implementiert WPF angefügte EreignisseHow WPF Implements Attached Events

In WPFWPFwerden angefügte Ereignisse verfügen über eine RoutedEvent ein, und durch die Struktur weitergeleitet werden, nachdem sie ausgelöst werden.In WPFWPF, attached events are backed by a RoutedEvent field and are routed through the tree after they are raised. In der Regel ist die Quelle des angefügten Ereignisses (das Objekt, welches das Ereignis auslöst) eine System- oder Dienstquelle, und das Objekt, das den Ereignis auslösenden Code ausführt, ist daher nicht direkter Teil der Elementstruktur.Typically, the source of the attached event (the object that raises the event) is a system or service source, and the object that runs the code that raises the event is therefore not a direct part of the element tree.

Szenarios für angefügte EreignisseScenarios for Attached Events

In WPFWPFwerden angefügte Ereignisse in bestimmten Funktionsbereichen vorhanden sind denen eine Abstraktion auf Dienstebene, z. B. für die Ereignisse, die von der statischen aktiviert Mouse Klasse oder die Validation Klasse.In WPFWPF, attached events are present in certain feature areas where there is service-level abstraction, such as for the events enabled by the static Mouse class or the Validation class. Klassen, die mit dem Dienst interagieren oder ihn verwenden, können entweder das Ereignis in der Syntax für angefügte Ereignisse verwenden, oder sie können das angefügte Ereignis als Routingereignis darstellen, das Teil davon ist, wie die Klasse die Funktionen des Diensts integriert.Classes that interact with or use the service can either use the event in the attached event syntax, or they can choose to surface the attached event as a routed event that is part of how the class integrates the capabilities of the service.

Obwohl WPFWPF eine Reihe von angefügten Ereignissen definiert, sind die Szenarios sehr begrenzt, in denen Sie das angefügte Ereignis direkt verwenden oder behandeln werden.Although WPFWPF defines a number of attached events, the scenarios where you will either use or handle the attached event directly are very limited. Im Allgemeinen dient das angefügte Ereignis einem Zweck der Architektur, aber dann wird es an ein nicht angefügtes Routingereignis weitergeleitet (gesichert mit einem CLR-Ereigniswrapper).Generally, the attached event serves an architecture purpose, but is then forwarded to a non-attached (backed with a CLR event "wrapper") routed event.

Z. B. die zugrunde liegende angefügte Ereignis Mouse.MouseDown mehr problemlos verarbeitet werden können auf ein beliebiges UIElement mit MouseDown , UIElement statt Umgang mit Syntax für angefügte Ereignisse entweder in XAMLXAML oder Code.For instance, the underlying attached event Mouse.MouseDown can more easily be handled on any given UIElement by using MouseDown on that UIElement rather than dealing with attached event syntax either in XAMLXAML or code. Das angefügte Ereignis dient einem Zweck in der Architektur, da es die zukünftige Erweiterung der Eingabegeräte ermöglicht.The attached event serves a purpose in the architecture because it allows for future expansion of input devices. Das hypothetische Gerät würde nur auslösen müssen Mouse.MouseDown , um Mauseingaben zu simulieren, und müssen nicht für die Ableitung Mouse dazu.The hypothetical device would only need to raise Mouse.MouseDown in order to simulate mouse input, and would not need to derive from Mouse to do so. Dieses Szenario beinhaltet jedoch Code zur Verarbeitung von Ereignissen, und die XAMLXAML-Behandlung des angefügten Ereignisses ist nicht für dieses Szenario relevant.However, this scenario involves code handling of the events, and XAMLXAML handling of the attached event is not relevant to this scenario.

Behandeln eines angefügten Ereignisses in WPFHandling an Attached Event in WPF

Der Prozess für die Behandlung eines angefügten Ereignisses und den von Ihnen geschriebenen Handlercode ist im Grunde derselbe wie für ein Routingereignis.The process for handling an attached event, and the handler code that you will write, is basically the same as for a routed event.

Im Allgemeinen unterscheidet sich ein angefügtes Ereignis von WPFWPF nicht sehr von einem WPFWPF-Routingereignis.In general, a WPFWPF attached event is not very different from a WPFWPF routed event. Die Unterschiede bestehen in der Quelle des Ereignisses und wie es durch eine Klasse als Member verfügbar gemacht wird (was auch die XAMLXAML-Handlersyntax beeinflusst).The differences are how the event is sourced and how it is exposed by a class as a member (which also affects the XAMLXAML handler syntax).

Aber wie oben erwähnt sind die vorhandenen angefügten Ereignisse von WPFWPF nicht speziell für die Behandlung in WPFWPF bestimmt.However, as noted earlier, the existing WPFWPF attached events are not particularly intended for handling in WPFWPF. Der Zweck des Ereignisses ist häufiger das Aktivieren eines zusammengesetzten Elements, um den Status an ein übergeordnetes Element in Zusammensetzung zu melden. In diesem Fall wird das Ereignis in der Regel im Code ausgelöst und beruht auf Klassenbehandlung in der entsprechenden übergeordneten Klasse.More often, the purpose of the event is to enable a composited element to report a state to a parent element in compositing, in which case the event is usually raised in code and also relies on class handling in the relevant parent class. Z. B. Elemente in einer Selector erwartet, dass Sie die angefügte Selected -Ereignis, das Klasse ist von behandelt die Selector Klasse, und klicken Sie dann möglicherweise konvertiert, indem die Selector Klasse in ein anderes Routingereignis SelectionChanged .For instance, items within a Selector are expected to raise the attached Selected event, which is then class handled by the Selector class and then potentially converted by the Selector class into a different routed event, SelectionChanged. Weitere Informationen über Routingereignisse und Klassenbehandlung finden Sie unter Markieren von Routingereignissen als behandelt und Klassenbehandlung.For more information on routed events and class handling, see Marking Routed Events as Handled, and Class Handling.

Definieren Ihres eigenen angefügten Ereignisses als RoutingereignisseDefining Your Own Attached Events as Routed Events

Wenn Sie von allgemeinen WPFWPF-Basisklassen ableiten, können Sie eigene angefügte Ereignisse implementieren, indem Sie bestimmte Mustermethoden in Ihrer Klasse einschließen und Hilfsmethoden verwenden, die bereits in den Basisklassen vorhanden sind.If you are deriving from common WPFWPF base classes, you can implement your own attached events by including certain pattern methods in your class and by using utility methods that are already present on the base classes.

Das Muster ist wie folgt:The pattern is as follows:

  • Eine Methode hinzufügenEventNameHandler mit zwei Parametern.A method AddEventNameHandler with two parameters. Der erste Parameter ist die Instanz, die der Ereignishandler hinzugefügt wird.The first parameter is the instance to which the event handler is added. Der zweite Parameter ist der hinzuzufügende Ereignishandler.The second parameter is the event handler to add. Die Methode muss public und static, ohne Rückgabewert.The method must be public and static, with no return value.

  • Eine Methode entfernenEventNameHandler mit zwei Parametern.A method RemoveEventNameHandler with two parameters. Der erste Parameter ist die Instanz, von der der Ereignishandler entfernt wird.The first parameter is the instance from which the event handler is removed. Der zweite Parameter ist der zu entfernende Ereignishandler.The second parameter is the event handler to remove. Die Methode muss public und static, ohne Rückgabewert.The method must be public and static, with no return value.

Die hinzufügenEventNameHandler Accessormethode vereinfacht die XAMLXAML Verarbeitung, wenn von angefügten Ereignishandlern Attribute für ein Element deklariert werden.The AddEventNameHandler accessor method facilitates the XAMLXAML processing when attached event handler attributes are declared on an element. Die hinzufügenEventNameHandler und entfernenEventNameHandler Methoden können auch den Codezugriff auf den Speicher des ereignishandlers für das angefügte Ereignis.The AddEventNameHandler and RemoveEventNameHandler methods also enable code access to the event handler store for the attached event.

Dieses allgemeine Muster ist noch nicht präzise genug für die praktische Implementierung in einem Framework, da jede gegebene Implementierung des XAMLXAML-Readers möglicherweise verschiedene Schemas zum Identifizieren der zugrunde liegenden Ereignisse in der unterstützenden Sprache und Architektur aufweisen könnte.This general pattern is not yet precise enough for practical implementation in a framework, because any given XAMLXAML reader implementation might have different schemes for identifying underlying events in the supporting language and architecture. Dies ist einer der Gründe, WPFWPF implementiert, die angefügte Ereignisse als Routingereignisse; der Bezeichner für ein Ereignis (RoutedEvent) wird bereits von definiert die WPFWPF Ereignissystem.This is one of the reasons that WPFWPF implements attached events as routed events; the identifier to use for an event (RoutedEvent) is already defined by the WPFWPF event system. Darüber hinaus ist das Weiterleiten eines Ereignisses eine natürliche Implementierungserweiterung auf dem XAMLXAML-Konzept auf Sprachebene der angefügten Ereignisse.Also, routing an event is a natural implementation extension on the XAMLXAML language-level concept of an attached event.

Die hinzufügenEventNameHandler Implementierung für eine WPFWPF angefügtes Ereignis besteht aus dem Aufruf der AddHandler mit dem Routingereignis und dem Handler als Argumente.The AddEventNameHandler implementation for a WPFWPF attached event consists of calling the AddHandler with the routed event and handler as arguments.

Diese Implementierungsstrategie und das Routingereignissystem beschränken Sie im Allgemeinen Behandlung für angefügte Ereignisse entweder UIElement abgeleiteten Klassen oder ContentElement abgeleitete Klassen, aus, da nur die Klassen verfügen AddHandler Implementierungen.This implementation strategy and the routed event system in general restrict handling for attached events to either UIElement derived classes or ContentElement derived classes, because only those classes have AddHandler implementations.

Der folgende Code definiert z.B. das angefügte Ereignis NeedsCleaning in der Besitzerklasse Aquarium, unter Verwendung der Strategie des angefügten Ereignisses von WPFWPF für das Deklarieren des angefügten Ereignisses als Routingereignis.For example, the following code defines the NeedsCleaning attached event on the owner class Aquarium, using the WPFWPF attached event strategy of declaring the attached event as a routed event.

public static readonly RoutedEvent NeedsCleaningEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AquariumFilter));
public static void AddNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}
public static void RemoveNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}
Public Shared ReadOnly NeedsCleaningEvent As RoutedEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(AquariumFilter))
Public Shared Sub AddNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub
Public Shared Sub RemoveNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub

Beachten Sie, dass die Methode verwendet wird, um das angefügte Ereignis-ID-Feld herzustellen RegisterRoutedEvent, ist tatsächlich die gleiche Methode, die verwendet wird, um ein nicht angefügtes Routingereignis zu registrieren.Note that the method used to establish the attached event identifier field, RegisterRoutedEvent, is actually the same method that is used to register a non-attached routed event. Angefügte Ereignisse und Routingereignisse werden alle in einem zentralisierten internen Speicher registriert.Attached events and routed events all are registered to a centralized internal store. Diese Implementierung des Ereignisspeichers ermöglicht die konzeptionelle Besonderheit „Ereignisse als Schnittstelle“, die im Artikel Übersicht über Routingereignisse diskutiert wird.This event store implementation enables the "events as an interface" conceptual consideration that is discussed in Routed Events Overview.

Auslösen eines angefügten Ereignisses von WPFRaising a WPF Attached Event

Sie müssen normalerweise keine vorhandenen, definierten angefügten Ereignisse von WPFWPF aus Ihrem Code auslösen.You do not typically need to raise existing WPFWPF defined attached events from your code. Diese Ereignisse folgen dem allgemeinen "Dienst"-Konzeptmodell, und Dienstklassen wie InputManager sind verantwortlich für das Auslösen der Ereignisse.These events follow the general "service" conceptual model, and service classes such as InputManager are responsible for raising the events.

Jedoch wenn Sie ein benutzerdefiniertes angefügtes Ereignis basierend auf definieren die WPFWPF -Modells angefügte Ereignisse RoutedEvent, können Sie RaiseEvent zum Auslösen eines angefügten Ereignisses von einem UIElement oder ContentElement.However, if you are defining a custom attached event based on the WPFWPF model of basing attached events on RoutedEvent, you can use RaiseEvent to raise an attached event from any UIElement or ContentElement. Das Auslösen eines Routingereignisses (angefügt oder nicht) erfordert, dass Sie ein bestimmtes Element in der Elementstruktur als Ereignisquelle deklarieren. Diese Quelle wird gemeldet, als die RaiseEvent Aufrufer.Raising a routed event (attached or not) requires that you declare a particular element in the element tree as the event source; that source is reported as the RaiseEvent caller. Das Element zu bestimmen, welches als die Quelle in der Struktur gemeldet ist, unterliegt Ihrer Verantwortung des Dienstes.Determining which element is reported as the source in the tree is your service's responsibility

Siehe auchSee also