Übersicht über RoutingereignisseRouted Events Overview

Dieses Thema beschreibt das Konzept von Routingereignissen in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF).This topic describes the concept of routed events in Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF). Das Thema definiert die Terminologie von Routingereignissen, beschreibt, wie Routingereignisse anhand einer Struktur von Elementen weitergeleitet werden und führt Sie in das Erstellen Ihrer eigenen, benutzerdefinierten Routingereignisse ein.The topic defines routed events terminology, describes how routed events are routed through a tree of elements, summarizes how you handle routed events, and introduces how to create your own custom routed events.

VorraussetzungenPrerequisites

In diesem Thema wird davon ausgegangen, dass Sie über grundlegende Kenntnisse zu Common Language Runtime (CLR)common language runtime (CLR) und objektorientiertem Programmieren sowie zur Konzeptualisierung der Beziehungen zwischen WPFWPF-Elementen als Struktur verfügen.This topic assumes that you have basic knowledge of the Common Language Runtime (CLR)common language runtime (CLR) and object-oriented programming, as well as the concept of how the relationships between WPFWPF elements can be conceptualized as a tree. Um den Beispielen in diesem Thema zu folgen, sollten Sie zudem Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) verstehen und wissen, wie sehr einfache WPFWPF-Anwendungen oder -Seiten geschrieben werden.In order to follow the examples in this topic, you should also understand Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) and know how to write very basic WPFWPF applications or pages. Weitere Informationen finden Sie unter Exemplarische Vorgehensweise: Meine erste WPF-Desktopanwendung und XAML Overview (WPF).For more information, see Walkthrough: My first WPF desktop application and XAML Overview (WPF).

Was ist ein Routingereignis?What Is a Routed Event?

Stellen Sie sich Routingereignisse entweder aus Sicht der Funktion oder der Implementierung vor.You can think about routed events either from a functional or implementation perspective. Beide Definitionen werden hier vorgestellt, da Benutzer die Definitionen unterschiedlich hilfreich finden.Both definitions are presented here, because some people find one or the other definition more useful.

Funktionale Definition: Ein Routingereignis ist ein Ereignistyp, der Handler kann auf mehreren Listenern in einer Elementstruktur und nicht nur auf das Objekt, das das Ereignis ausgelöst hat.Functional definition: A routed event is a type of event that can invoke handlers on multiple listeners in an element tree, rather than just on the object that raised the event.

Implementierungsdefinition: Ein Routingereignis ist ein CLRCLR -Ereignis, das von einer Instanz von gesichert wird die RoutedEvent Klasse und wird verarbeitet, indem die Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Ereignissystem.Implementation definition: A routed event is a CLRCLR event that is backed by an instance of the RoutedEvent class and is processed by the Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) event system.

Eine typische WPFWPF-Anwendung enthält viele Elemente.A typical WPFWPF application contains many elements. Egal ob im Code erstellt oder in XAMLXAML deklariert, stehen diese Elemente in einer Beziehung einer Elementstruktur zueinander.Whether created in code or declared in XAMLXAML, these elements exist in an element tree relationship to each other. Die Ereignisroute kann sich abhängig von der Ereignisdefinition in eine von zwei Richtungen bewegen; im Allgemeinen bewegt sie sich vom Quellelement aus und „steigt“ in der Elementstruktur auf, bis sie den Stamm der Elementstruktur erreicht (normalerweise eine Seite oder ein Fenster).The event route can travel in one of two directions depending on the event definition, but generally the route travels from the source element and then "bubbles" upward through the element tree until it reaches the element tree root (typically a page or a window). Dieses Bubblingkonzept kommt Ihnen möglicherweise bekannt vor, wenn Sie schon einmal mit dem DHTML-Objektmodell gearbeitet haben.This bubbling concept might be familiar to you if you have worked with the DHTML object model previously.

Betrachten Sie die folgende einfache Elementstruktur:Consider the following simple element tree:

<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
  <StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler">
    <Button Name="YesButton" Width="Auto" >Yes</Button>
    <Button Name="NoButton" Width="Auto" >No</Button>
    <Button Name="CancelButton" Width="Auto" >Cancel</Button>
  </StackPanel>
</Border>

Diese Elementstruktur erzeugt in etwa Folgendes:This element tree produces something like the following:

Die Schaltflächen „Ja“, „Nein“ und „Abbrechen“Yes, No, and Cancel buttons

In dieser vereinfachten Elementstruktur ist die Quelle des eine Click Ereignis ist eines von der Button Elemente, und der Button geklickt wurde ist das erste Element, das die Möglichkeit zum Behandeln des Ereignisses hat.In this simplified element tree, the source of a Click event is one of the Button elements, and whichever Button was clicked is the first element that has the opportunity to handle the event. Aber wenn keine Ereignishandler angefügt der Button fungiert für das Ereignis, und klicken Sie dann nach oben an das Ereignis übergeben werden die Button übergeordnete Element in der Elementstruktur, handelt es sich die StackPanel.But if no handler attached to the Button acts on the event, then the event will bubble upwards to the Button parent in the element tree, which is the StackPanel. Potenziell das Ereignis wird weitergeleitet, Border, und dann bis zum Seitenstamm der Elementstruktur (nicht dargestellt).Potentially, the event bubbles to Border, and then beyond to the page root of the element tree (not shown).

Das heißt, die Ereignisroute für dieses Click Ereignis ist:In other words, the event route for this Click event is:

Button-->StackPanel-->Border-->...Button-->StackPanel-->Border-->...

Szenarios auf oberster Ebene für RoutingereignisseTop-level Scenarios for Routed Events

Im folgenden wird eine kurze Zusammenfassung der Szenarios dargestellt, die das Konzept der Routingereignisse motiviert haben; außerdem wird erläutert, warum ein herkömmliches CLRCLR-Ereignis für die folgenden Szenarios nicht ausreichend ist:The following is a brief summary of the scenarios that motivated the routed event concept, and why a typical CLRCLR event was not adequate for these scenarios:

Zusammensetzung und Kapselung: Verschiedene Steuerelemente in WPFWPF verfügen über ein umfangreiches Inhaltsmodell.Control composition and encapsulation: Various controls in WPFWPF have a rich content model. Sie können z. B. ein Bild innerhalb des Platzieren einer Button, effektiv die visuelle Struktur der Schaltfläche Erweitert.For example, you can place an image inside of a Button, which effectively extends the visual tree of the button. Das hinzugefügte Bild muss jedoch nicht unterbrechen die Treffertest-Verhalten, das bewirkt, eine Schaltfläche dass, um auf Antworten einer Click seines Inhalts, selbst wenn der Benutzer auf Pixel klickt, die technisch Teil des Bilds sind.However, the added image must not break the hit-testing behavior that causes a button to respond to a Click of its content, even if the user clicks on pixels that are technically part of the image.

Einzelne Anfügepunkte für Handleranfügepunkte: In Windows FormsWindows Forms, Sie müssten den gleichen Handler mehrmals zur Verarbeitung der Ereignisse anfügen, die aus mehreren Elementen ausgelöst werden können.Singular handler attachment points: In Windows FormsWindows Forms, you would have to attach the same handler multiple times to process events that could be raised from multiple elements. Routingereignisse ermöglichen es Ihnen, diesen Handler nur einmal anzufügen, wie im vorherigen Beispiel gezeigt wurde, und verwenden Handlerlogik, um ggf. zu bestimmen, woher das Ereignis stammt.Routed events enable you to attach that handler only once, as was shown in the previous example, and use handler logic to determine where the event came from if necessary. Dies kann z.B. der Handler für die zuvor gezeigte XAMLXAML sein:For instance, this might be the handler for the previously shown XAMLXAML:

private void CommonClickHandler(object sender, RoutedEventArgs e)
{
  FrameworkElement feSource = e.Source as FrameworkElement;
  switch (feSource.Name)
  {
    case "YesButton":
      // do something here ...
      break;
    case "NoButton":
      // do something ...
      break;
    case "CancelButton":
      // do something ...
      break;
  }
  e.Handled=true;
}
Private Sub CommonClickHandler(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim feSource As FrameworkElement = TryCast(e.Source, FrameworkElement)
  Select Case feSource.Name
    Case "YesButton"
      ' do something here ...
    Case "NoButton"
      ' do something ...
    Case "CancelButton"
      ' do something ...
  End Select
  e.Handled=True
End Sub

Klassenbehandlung: Routingereignisse lassen einen statischen Handler, die von der Klasse definiert ist.Class handling: Routed events permit a static handler that is defined by the class. Dieser Klassenhandler hat die Möglichkeit, ein Ereignis vor angefügten Instanzhandlern zu behandeln.This class handler has the opportunity to handle an event before any attached instance handlers can.

Verweisen auf ein Ereignis ohne Reflektion: Bestimmte Code und markuptechniken erfordern eine Möglichkeit, ein bestimmtes Ereignis zu identifizieren.Referencing an event without reflection: Certain code and markup techniques require a way to identify a specific event. Ein Routingereignis erstellt ein RoutedEvent -Feld als Bezeichner, der eine stabile ereignisidentifikationstechnik bietet, die keine statischen oder Laufzeit Reflektion erforderlich ist.A routed event creates a RoutedEvent field as an identifier, which provides a robust event identification technique that does not require static or run-time reflection.

So werden Routingereignis implementiertHow Routed Events Are Implemented

Ein Routingereignis ist ein CLRCLR -Ereignis, das von einer Instanz von gestützt wird der RoutedEvent Klasse und registriert die WPFWPF Ereignissystem.A routed event is a CLRCLR event that is backed by an instance of the RoutedEvent class and registered with the WPFWPF event system. Die RoutedEvent Instanz abgerufen, die von der Registrierung bleibt in der Regel als eine public static readonly Feldmember der Klasse, die registriert und somit "besitzt" das Routingereignis.The RoutedEvent instance obtained from registration is typically retained as a public static readonly field member of the class that registers and thus "owns" the routed event. Die Verbindung mit dem identisch benannten CLRCLR-Ereignis (das manchmal auch als „Wrapper“-Ereignis bezeichnet wird) erfolgt durch das Außerkraftsetzen der add- und remove-Implementierungen für das CLRCLR-Ereignis.The connection to the identically named CLRCLR event (which is sometimes termed the "wrapper" event) is accomplished by overriding the add and remove implementations for the CLRCLR event. Normalerweise bleiben add und remove als impliziter Standard bestehen, der die entsprechende sprachspezifische Ereignissyntax zum Hinzufügen und Entfernen von Handlern dieses Ereignisses verwendet.Ordinarily, the add and remove are left as an implicit default that uses the appropriate language-specific event syntax for adding and removing handlers of that event. Das Routingereignis unterstützungs- und Verbindungsmechanismus ähnelt im Prinzip wie eine Abhängigkeitseigenschaft ist eine CLRCLR -Eigenschaft, die von unterstützt wird die DependencyProperty Klasse und registriert die WPFWPF Eigenschaftensystem.The routed event backing and connection mechanism is conceptually similar to how a dependency property is a CLRCLR property that is backed by the DependencyProperty class and registered with the WPFWPF property system.

Das folgende Beispiel zeigt die Deklaration für eine benutzerdefinierte Tap Routingereignis, einschließlich der Registrierung und der Offenlegung von der RoutedEvent Feld "ID" und die add und remove Implementierungen für die Tap CLRCLR Ereignis.The following example shows the declaration for a custom Tap routed event, including the registration and exposure of the RoutedEvent identifier field and the add and remove implementations for the Tap CLRCLR event.

public static readonly RoutedEvent TapEvent = EventManager.RegisterRoutedEvent(
    "Tap", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(MyButtonSimple));

// Provide CLR accessors for the event
public event RoutedEventHandler Tap
{
        add { AddHandler(TapEvent, value); } 
        remove { RemoveHandler(TapEvent, value); }
}
Public Shared ReadOnly TapEvent As RoutedEvent = EventManager.RegisterRoutedEvent("Tap", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(MyButtonSimple))

' Provide CLR accessors for the event
Public Custom Event Tap As RoutedEventHandler
    AddHandler(ByVal value As RoutedEventHandler)
        Me.AddHandler(TapEvent, value)
    End AddHandler

    RemoveHandler(ByVal value As RoutedEventHandler)
        Me.RemoveHandler(TapEvent, value)
    End RemoveHandler

    RaiseEvent(ByVal sender As Object, ByVal e As RoutedEventArgs)
        Me.RaiseEvent(e)
    End RaiseEvent
End Event

Routingereignishandler und XAMLRouted Event Handlers and XAML

Um einen Handler für ein Ereignis mit XAMLXAML hinzuzufügen, deklarieren Sie den Ereignisnamen als Attribut auf dem Element, das ein Ereignislistener ist.To add a handler for an event using XAMLXAML, you declare the event name as an attribute on the element that is an event listener. Der Wert des Attributs ist der Name Ihrer implementierten Handlermethode, die in der partiellen Klasse der CodeBehind-Datei vorhanden sein muss.The value of the attribute is the name of your implemented handler method, which must exist in the partial class of the code-behind file.

<Button Click="b1SetColor">button</Button>

Die XAMLXAML-Syntax zum Hinzufügen von Standard-CLRCLR-Ereignishandlern ist die gleiche wie für das Hinzufügen von Routingereignishandlern, da Sie genauso Handler in den CLRCLR-Ereigniswrapper einfügen, dem eine Routingereignisimplementierung zu Grunde liegt .The XAMLXAML syntax for adding standard CLRCLR event handlers is the same for adding routed event handlers, because you are really adding handlers to the CLRCLR event wrapper, which has a routed event implementation underneath. Weitere Informationen zum Hinzufügen von Ereignishandlern in XAMLXAML finden Sie unter Übersicht über XAML (WPF).For more information about adding event handlers in XAMLXAML, see XAML Overview (WPF).

RoutingstrategienRouting Strategies

Routingereignisse verwenden eine von drei Routingstrategien:Routed events use one of three routing strategies:

  • Bubbling: Die Ereignisquelle Ereignishandler werden aufgerufen.Bubbling: Event handlers on the event source are invoked. Das Routingereignis wird dann auf nachfolgenden übergeordnete Elemente weitergeleitet, bis es den Stamm der Elementstruktur erreicht.The routed event then routes to successive parent elements until reaching the element tree root. Die meisten Routingereignisse verwenden die Bubblingroutingstrategie.Most routed events use the bubbling routing strategy. Bubblingroutingereignisse werden üblicherweise verwendet, um Eingabe- oder Zustandänderungen von unterschiedlichen Steuerelemente oder andere Elementen der Benutzeroberfläche zu melden.Bubbling routed events are generally used to report input or state changes from distinct controls or other UI elements.

  • Direkt: Nur das Quellelement selbst erhält die Gelegenheit, Reaktion Handler aufrufen.Direct: Only the source element itself is given the opportunity to invoke handlers in response. Dies entspricht dem „Routing“, das Windows FormsWindows Forms für Ereignisse verwendet.This is analogous to the "routing" that Windows FormsWindows Forms uses for events. Anders als bei einer Standard CLRCLR -Ereignis unterstützen direkte Routingereignisse Klassenbehandlung (die Klassenbehandlung wird in einem späteren Abschnitt erläutert) und kann verwendet werden, indem EventSetter und EventTrigger.However, unlike a standard CLRCLR event, direct routed events support class handling (class handling is explained in an upcoming section) and can be used by EventSetter and EventTrigger.

  • Tunneling: Zunächst werden Ereignishandler am Stamm Elementstruktur aufgerufen.Tunneling: Initially, event handlers at the element tree root are invoked. Das Routingereignis bewegt sich dann über eine Route durch die nachfolgenden untergeordneten Elemente in Richtung des Knotenelements, das die Quelle des Routingereignisses ist (das Element, das das Routingereignis ausgelöst).The routed event then travels a route through successive child elements along the route, towards the node element that is the routed event source (the element that raised the routed event). Tunnelingroutingereignisse werden oft als Teil der Zusammensetzung eines Steuerelements verwendet oder behandelt, sodass Elemente der einzelnen Teile von Ereignissen, die für das vollständige Steuerelement spezifisch sind, bewusst unterdrückt oder ersetzt werden können.Tunneling routed events are often used or handled as part of the compositing for a control, such that events from composite parts can be deliberately suppressed or replaced by events that are specific to the complete control. Eingabeereignisse aus WPFWPF sind oft als Tunneling/Bubbling-Paar implementiert.Input events provided in WPFWPF often come implemented as a tunneling/bubbling pair. Tunnelingereignisse werden manchmal auch als Vorschauereignisse bezeichnet; dies liegt an einer Benennungskonvention für Paare.Tunneling events are also sometimes referred to as Preview events, because of a naming convention that is used for the pairs.

Was ist der Vorteil von Routingereignissen?Why Use Routed Events?

Als Anwendungsentwickler müssen Sie nicht immer wissen oder sicherstellen, dass das Ereignis, das Sie behandeln, als Routingereignis implementiert wird.As an application developer, you do not always need to know or care that the event you are handling is implemented as a routed event. Weitergeleitete Ereignisse weisen ein besonderes Verhalten auf, aber dieses Verhalten ist weitestgehend unsichtbar, wenn Sie ein Ereignisses auf dem Element behandeln, in dem es ausgelöst wurde.Routed events have special behavior, but that behavior is largely invisible if you are handling an event on the element where it is raised.

Routingereignisse erweisen sich besonders dort als sehr nützlich, wo Sie eines der folgenden Szenarios verwenden: beim Definieren von gängigen Handlern am gängigen Stamm, beim Zusammensetzen eines eigenen Steuerelements oder beim Definieren Ihrer eigenen, benutzerdefinierten Steuerelementklasse.Where routed events become powerful is if you use any of the suggested scenarios: defining common handlers at a common root, compositing your own control, or defining your own custom control class.

Routingereignislistener und Routingereignisquellen müssen kein gemeinsames Ereignis in ihrer Hierarchie aufweisen.Routed event listeners and routed event sources do not need to share a common event in their hierarchy. Alle UIElement oder ContentElement kann ein Ereignislistener für jedes beliebige Routingereignis sein.Any UIElement or ContentElement can be an event listener for any routed event. Aus diesem Grund können Sie den vollständigen Satz an Routingereignissen, die durchgängig in der API arbeiten als konzeptionelle "Schnittstelle", die unterschiedliche Elemente in der Anwendung Ereignisinformationen austauschen können.Therefore, you can use the full set of routed events available throughout the working API set as a conceptual "interface" whereby disparate elements in the application can exchange event information. Dieses „Schnittstellen“-Konzept für Routingereignisse kann besonders auf Eingabeereignisse angewendet werden.This "interface" concept for routed events is particularly applicable for input events.

Routingereignisse können auch für die Kommunikation durch die Elementstruktur verwendet werden, da die Ereignisdaten für jedes Element auf der Route aufrechterhalten werden.Routed events can also be used to communicate through the element tree, because the event data for the event is perpetuated to each element in the route. Ein Element könnte die Ereignisdaten ändern, und diese Änderung wäre für das nächste Element auf der Route verfügbar.One element could change something in the event data, and that change would be available to the next element in the route.

Neben dem Routingaspekt gibt es zwei andere Gründe, aus denen ein beliebiges WPFWPF-Ereignis möglicherweise als Routingereignis statt als CLRCLR-Standardereignis implementiert wird.Other than the routing aspect, there are two other reasons that any given WPFWPF event might be implemented as a routed event instead of a standard CLRCLR event. Wenn Sie Ihr eigenes Ereignis implementieren, können Sie auch folgende Prinzipien berücksichtigen:If you are implementing your own events, you might also consider these principles:

  • Bestimmte WPFWPF Stile und Vorlagen Features wie z. B. EventSetter und EventTrigger erfordern das verwiesene Ereignis ein Routingereignis ist.Certain WPFWPF styling and templating features such as EventSetter and EventTrigger require the referenced event to be a routed event. Dies ist das Szenario mit einem Ereignisbezeichner, das weiter oben erwähnt wurde.This is the event identifier scenario mentioned earlier.

  • Routingereignisse unterstützen einen Mechanismus zur Klassenbehandlung, durch den die Klasse statische Methoden angeben kann, die die Möglichkeit haben, Routingereignisse zu behandeln, bevor registrierte Instanzenhandler darauf zugreifen können.Routed events support a class handling mechanism whereby the class can specify static methods that have the opportunity to handle routed events before any registered instance handlers can access them. Dies ist beim Entwerfen von Steuerelementen hilfreich, da Ihre Klasse ereignisgesteuertes Klassenverhalten erzwingen kann, das nicht versehentlich durch das Behandeln eines Ereignisses auf einer Instanz unterdrückt werden kann.This is very useful in control design, because your class can enforce event-driven class behaviors that cannot be accidentally suppressed by handling an event on an instance.

Jeder der oben genannten Aspekte wird in einem separaten Abschnitt dieses Themas erläutert.Each of the above considerations is discussed in a separate section of this topic.

Hinzufügen und implementieren eines Ereignishandlers für ein RoutingereignisAdding and Implementing an Event Handler for a Routed Event

Zum Hinzufügen eines Ereignishandlers in XAMLXAML müssen Sie einfach nur den Ereignisnamen als Attribut in ein Element einfügen und den Attributwert auf den Namen des Ereignishandlers festlegen, der einen angemessenen Delegaten implementiert, wie in folgendem Beispiel veranschaulicht.To add an event handler in XAMLXAML, you simply add the event name to an element as an attribute and set the attribute value as the name of the event handler that implements an appropriate delegate, as in the following example.

<Button Click="b1SetColor">button</Button>

b1SetColor Der Name des implementierten Handlers, der Code enthält, die behandelt, die Click Ereignis.b1SetColor is the name of the implemented handler that contains the code that handles the Click event. b1SetColor müssen die gleiche Signatur wie der RoutedEventHandler -Delegaten, der den Ereignishandlerdelegaten ist für die Click Ereignis.b1SetColor must have the same signature as the RoutedEventHandler delegate, which is the event handler delegate for the Click event. Der erste Parameter aller Delegaten von Routingereignishandlern gibt das Element an, dem der Ereignishandler hinzugefügt wird, und der zweite Parameter gibt die Daten des Ereignisses an.The first parameter of all routed event handler delegates specifies the element to which the event handler is added, and the second parameter specifies the data for the event.

void b1SetColor(object sender, RoutedEventArgs args)
{
  //logic to handle the Click event
}
Private Sub b1SetColor(ByVal sender As Object, ByVal args As RoutedEventArgs)
  'logic to handle the Click event
End Sub

RoutedEventHandler ist die grundlegende Delegat für Routingereignishandler.RoutedEventHandler is the basic routed event handler delegate. Für Routingereignisse, die auf bestimmte Steuerelemente oder Szenarien ausgelegt sind, können die für die Routingereignishandler zu verwendenden Delegaten möglicherweise so spezialisiert werden, dass sie spezialisierte Ereignisdaten übertragen können.For routed events that are specialized for certain controls or scenarios, the delegates to use for the routed event handlers also might become more specialized, so that they can transmit specialized event data. Z. B. in einem gängigen Eingabeszenario Sie möglicherweise behandeln eine DragEnter Routingereignis.For instance, in a common input scenario, you might handle a DragEnter routed event. Der Handler implementieren sollte die DragEventHandler delegieren.Your handler should implement the DragEventHandler delegate. Mithilfe des spezifischsten Delegaten können Sie verarbeiten die DragEventArgs im Handler und lesen die Data Eigenschaft, die die zwischenablagenutzlast des Ziehvorgangs enthält.By using the most specific delegate, you can process the DragEventArgs in the handler and read the Data property, which contains the clipboard payload of the drag operation.

Ein vollständiges Beispiel zum Hinzufügen eines Ereignishandlers in ein Element mit XAMLXAML finden Sie unter Behandeln eines Routingereignisses.For a complete example of how to add an event handler to an element using XAMLXAML, see Handle a Routed Event.

Das Hinzufügen eines Handlers für ein Routingereignis in einer Anwendung, die im Code erstellt wird, ist einfach.Adding a handler for a routed event in an application that is created in code is straightforward. Routingereignishandler können immer hinzugefügt werden, über eine Hilfsmethode AddHandler (Dies ist dieselbe Methode, die die vorhandene Unterstützung für ruft add.) Allerdings haben vorhandene WPFWPF-Routingereignisse für gewöhnlich Unterstützungsimplementierungen mit add- und remove-Logik, die es ermöglichen, dass die Handler für die Routingereignisse von einer sprachspezifischen Ereignissyntax hinzugefügt werden können; diese Syntax ist viel intuitiver als die Hilfsmethode.Routed event handlers can always be added through a helper method AddHandler (which is the same method that the existing backing calls for add.) However, existing WPFWPF routed events generally have backing implementations of add and remove logic that allow the handlers for routed events to be added by a language-specific event syntax, which is more intuitive syntax than the helper method. Im Folgenden wird die Hilfsmethode in einem Beispiel verwendet:The following is an example usage of the helper method:

void MakeButton()
 {
     Button b2 = new Button();
     b2.AddHandler(Button.ClickEvent, new RoutedEventHandler(Onb2Click));
 }
 void Onb2Click(object sender, RoutedEventArgs e)
 {
     //logic to handle the Click event     
 }
Private Sub MakeButton()
     Dim b2 As New Button()
     b2.AddHandler(Button.ClickEvent, New RoutedEventHandler(AddressOf Onb2Click))
End Sub
 Private Sub Onb2Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
     'logic to handle the Click event     
 End Sub

Das folgende Beispiel zeigt die C# -Operatorsyntax (Visual Basic hat geringfügig andere Operatorsyntax aufgrund seiner Behandlung von Dereferenzierung):The next example shows the C# operator syntax (Visual Basic has slightly different operator syntax because of its handling of dereferencing):

void MakeButton2()
{
  Button b2 = new Button();
  b2.Click += new RoutedEventHandler(Onb2Click2);
}
void Onb2Click2(object sender, RoutedEventArgs e)
{
  //logic to handle the Click event     
}
Private Sub MakeButton2()
  Dim b2 As New Button()
  AddHandler b2.Click, AddressOf Onb2Click2
End Sub
Private Sub Onb2Click2(ByVal sender As Object, ByVal e As RoutedEventArgs)
  'logic to handle the Click event     
End Sub

Ein Beispiel für das Hinzufügen eines Ereignishandlers in Code finden Sie unter Hinzufügen eines Ereignishandlers mithilfe von Code.For an example of how to add an event handler in code, see Add an Event Handler Using Code.

Wenn Sie Visual Basic verwenden, können Sie auch die Handles Schlüsselwort, um Handler als Teil der Handlerdeklarationen hinzufügen.If you are using Visual Basic, you can also use the Handles keyword to add handlers as part of the handler declarations. Weitere Informationen finden Sie unter Visual Basic- und WPF-Ereignisbehandlung.For more information, see Visual Basic and WPF Event Handling.

Das Handled-KonzeptThe Concept of Handled

Alle Routingereignisse verwenden eine gemeinsame Ereignisdaten-Basisklasse, RoutedEventArgs.All routed events share a common event data base class, RoutedEventArgs. RoutedEventArgs definiert die Handled -Eigenschaft, die einen booleschen Wert akzeptiert.RoutedEventArgs defines the Handled property, which takes a Boolean value. Der Zweck der Handled Eigenschaft ist die Aktivierung von allen Ereignishandler entlang der Route, die das Routingereignis als markieren behandelt, durch Festlegen des Werts der Handled zu true.The purpose of the Handled property is to enable any event handler along the route to mark the routed event as handled, by setting the value of Handled to true. Nachdem die freigegebenen Ereignisdaten vom Handler an einem Element auf der Route verarbeitet wurden, werden die Daten wieder jedem Listener auf der Route gemeldet.After being processed by the handler at one element along the route, the shared event data is again reported to each listener along the route.

Der Wert des Handled wirkt sich auf wie ein Ereignis gemeldet oder verarbeitet werden, bei der Übertragung weiter entlang der Route.The value of Handled affects how a routed event is reported or processed as it travels further along the route. Wenn Handled ist true im Ereignis für ein Routingereignis, Ereignishandler, die für das Routingereignis auf anderen Elementen Lauschen sind in der Regel nicht mehr aufgerufen für diese bestimmte Ereignisinstanz.If Handled is true in the event data for a routed event, then handlers that listen for that routed event on other elements are generally no longer invoked for that particular event instance. Dies gilt sowohl für in XAMLXAML angefügte Handler als auch für Handler, die von anderen sprachspezifischen Anfügesyntaxen für Ereignishandlern, wie z.B. += oder Handles, hinzugefügt wurden.This is true both for handlers attached in XAMLXAML and for handlers added by language-specific event handler attachment syntaxes such as += or Handles. Für die meisten gängigen handlerszenarios, markieren Sie ein Ereignis als behandelt, indem Handled zu true wird "stop" routing für entweder eine Tunneling- oder bubbling-Route sowie für alle Ereignisse, die zu einem Zeitpunkt in der Route, die von einem Klassenhandler behandelt wird.For most common handler scenarios, marking an event as handled by setting Handled to true will "stop" routing for either a tunneling route or a bubbling route, and also for any event that is handled at a point in the route by a class handler.

Es ist jedoch bei dem Listener weiterhin Handler als Reaktion auf Routingereignisse ausgeführt können Mechanismus "HandledEventsToo", in denen Handled ist true in den Ereignisdaten.However, there is a "handledEventsToo" mechanism whereby listeners can still run handlers in response to routed events where Handled is true in the event data. Das heißt, ist die Ereignisroute nicht wirklich durch Markieren der Ereignisdaten als behandelt beendet.In other words, the event route is not truly stopped by marking the event data as handled. Sie können den HandledEventsToo-Mechanismus nur verwenden, im Code oder in einem EventSetter:You can only use the handledEventsToo mechanism in code, or in an EventSetter:

Zusätzlich zu dem Verhalten, Handled Zustand erzeugt in Routingereignisse das Konzept der Handled hat Auswirkungen, wie Sie Ihre Anwendung entwerfen und den Ereignishandlercode schreiben sollten.In addition to the behavior that Handled state produces in routed events, the concept of Handled has implications for how you should design your application and write the event handler code. Sie können konzipieren Handled als ein einfaches Protokoll, das von Routingereignissen verfügbar gemacht wird.You can conceptualize Handled as being a simple protocol that is exposed by routed events. Wie Sie dieses Protokoll genau verwenden liegt bei Sie, aber der konzeptuelle Entwurf, wie der Wert des Handled soll verwendet werden, lautet wie folgt:Exactly how you use this protocol is up to you, but the conceptual design for how the value of Handled is intended to be used is as follows:

  • Wenn ein Routingereignis als behandelt markiert ist, muss es nicht von anderen Elementen auf dieser Route erneut verarbeitet werden.If a routed event is marked as handled, then it does not need to be handled again by other elements along that route.

  • Wenn ein Routingereignis nicht als behandelt markiert ist, haben andere Listener, die zuvor entlang der Route ausgewählt, entweder nicht registriert einen Handler, oder der Handler, die registrierten ausgewählt haben, nicht zum Bearbeiten von Daten für das Ereignis aus, und legen Sie Handled zu true.If a routed event is not marked as handled, then other listeners that were earlier along the route have chosen either not to register a handler, or the handlers that were registered chose not to manipulate the event data and set Handled to true. (Es ist selbstverständlich auch möglich, dass der aktuelle Listener der erste Punkt auf der Route ist.) Handler auf dem aktuellen Listener verfügen jetzt über drei mögliche Vorgehensweisen:(Or, it is of course possible that the current listener is the first point in the route.) Handlers on the current listener now have three possible courses of action:

    • Führen Sie keine Aktion durch; das Ereignis bleibt unbehandelt und wird an den nächsten Listener weitergeleitet.Take no action at all; the event remains unhandled, and the event routes to the next listener.

    • Führen Sie Code als Reaktion auf das Ereignis aus, aber seien Sie sich im Klaren, dass die Aktion nicht umfangreich genug war, um ein Markieren des Ereignisses als „handled“ zu rechtfertigen.Execute code in response to the event, but make the determination that the action taken was not substantial enough to warrant marking the event as handled. Das Ereignis wird an den nächsten Listener weitergeleitet.The event routes to the next listener.

    • Führen Sie Code als Reaktion auf das Ereignis aus.Execute code in response to the event. Markieren Sie das Ereignis in den an den Handler übergebenen Ereignisdaten als „handled“, weil die ausgeführte Aktion umfangreich genug war, um das Markieren als „handled“ zu rechtfertigen.Mark the event as handled in the event data passed to the handler, because the action taken was deemed substantial enough to warrant marking as handled. Das Ereignis weiterhin weitergeleitet werden können, an den nächsten Listener, jedoch mit Handled = true in seinen Ereignisdaten, sodass nur handledEventsToo Listener haben die Möglichkeit, weitere Handler aufzurufen.The event still routes to the next listener, but with Handled=true in its event data, so only handledEventsToo listeners have the opportunity to invoke further handlers.

Dieser konzeptuelle Entwurf wird durch die oben genannten Routingverhalten bestätigt: Es ist schwieriger (aber immer noch in Code und Formaten möglich), um Handler für Routingereignisse anzufügen, die aufgerufen werden, auch wenn ein vorheriger Handler entlang der Route bereitseingerichtethatHandledzu true.This conceptual design is reinforced by the routing behavior mentioned earlier: it is more difficult (although still possible in code or styles) to attach handlers for routed events that are invoked even if a previous handler along the route has already set Handled to true.

Weitere Informationen zu HandledKlassenbehandlung von Routingereignissen und Empfehlungen, wenn es sich um ein Routingereignis als markieren geeignete Handled, finden Sie unter Markieren von Routingereignissen als behandelt und Klassenbehandlung.For more information about Handled, class handling of routed events, and recommendations about when it is appropriate to mark a routed event as Handled, see Marking Routed Events as Handled, and Class Handling.

In Anwendungen ist es üblich, lediglich ein Bubblingroutingereignis auf dem Objekt zu behandeln, das es ausgelöst hat, ohne die Routingmerkmale des Ereignisses zu berücksichtigen.In applications, it is quite common to just handle a bubbling routed event on the object that raised it, and not be concerned with the event's routing characteristics at all. Allerdings empfiehlt es sich immer noch, das Routingereignis in den Ereignisdaten als „handled“ zu markieren, um unvorhergesehene Nebeneffekte zu verhindern, nur für den Fall, dass ein Element, das sich weiter oben in der Elementstruktur befindet, auch einen angefügten Handler für das gleiche Routingereignis aufweist.However, it is still a good practice to mark the routed event as handled in the event data, to prevent unanticipated side effects just in case an element that is further up the element tree also has a handler attached for that same routed event.

KlassenhandlerClass Handlers

Wenn Sie eine abgeleitete Klasse definieren, in irgendeiner Art von DependencyObject, Sie können auch definieren, und fügen Sie einen Klassenhandler für ein Routingereignis, das ein deklarierter oder geerbter Ereignismember Ihrer Klasse ist.If you are defining a class that derives in some way from DependencyObject, you can also define and attach a class handler for a routed event that is a declared or inherited event member of your class. Klassenhandler werden vor Handler für Instanzlistener, die an eine Instanz dieser Klasse angefügt sind, aufgerufen, immer dann, wenn ein Routingevent eine Elementinstanz auf seiner Route erreicht.Class handlers are invoked before any instance listener handlers that are attached to an instance of that class, whenever a routed event reaches an element instance in its route.

Einige WPFWPF-Steuerelemente verfügen über inhärente Klassenbehandlung für bestimmte Routingereignisse.Some WPFWPF controls have inherent class handling for certain routed events. Dies kann nach außen den Anschein erwecken, als dass das Routingereignis nicht einmal ausgelöst wird, aber in Wirklichkeit wird es von einer Klasse behandelt, und das Routingereignis kann immer noch von Ihren Instanzhandlern behandelt werden, wenn Sie bestimmte Techniken verwenden.This might give the outward appearance that the routed event is not ever raised, but in reality it is being class handled, and the routed event can potentially still be handled by your instance handlers if you use certain techniques. Außerdem machen viele Basisklassen und Steuerelemente virtuelle Methoden verfügbar, die zum Außerkraftsetzen von Klassenbehandlungsverhalten verwendet werden können.Also, many base classes and controls expose virtual methods that can be used to override class handling behavior. Weitere Informationen sowohl zum Umgehen unerwünschter Klassenbehandlung als auch zum Definieren Ihres eigenen Klassenverhaltens in einer benutzerdefinierten Klasse finden Sie unter Markieren von Routingereignissen als behandelt und Klassenbehandlung.For more information both on how to work around undesired class handling and on defining your own class handling in a custom class, see Marking Routed Events as Handled, and Class Handling.

Angefügte Ereignisse in WPFAttached Events in WPF

Die XAMLXAML-Sprache definiert auch eine besondere Art von Ereignissen, die als angefügte Ereignisse bezeichnet werden.The XAMLXAML language also defines a special type of event called an attached event. Mit einem angefügten Ereignis können Sie einen Ereignishandler für ein bestimmtes Ereignis zu einem beliebigen Element hinzuzufügen.An attached event enables you to add a handler for a particular event to an arbitrary element. Das Element, das das Ereignis behandelt, muss das angefügte Ereignis weder definieren noch erben; zudem muss weder das Objekt, dass das Ereignis möglicherweise auslöst, noch die dafür zuständige Instanz dieses Ereignis als Klassenmember definieren oder „besitzen“.The element handling the event need not define or inherit the attached event, and neither the object potentially raising the event nor the destination handling instance must define or otherwise "own" that event as a class member.

Das WPFWPF-Eingabesystem verwendet angefügte Ereignisse in großem Umfang.The WPFWPF input system uses attached events extensively. Fast alle dieser angefügten Ereignisse werden jedoch über Basiselemente weitergeleitet.However, nearly all of these attached events are forwarded through base elements. Die Eingabeereignisse erscheinen dann als äquivalente nicht angefügte Routingereignisse, die Member der Basiselementklasse sind.The input events then appear as equivalent non-attached routed events that are members of the base element class. 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.

Weitere Informationen zu angefügten Ereignissen in WPFWPF finden Sie unter Übersicht über angefügte Ereignisse.For more information about attached events in WPFWPF, see Attached Events Overview.

Qualifizierte Ereignisnamen in XAMLQualified Event Names in XAML

Wenn Sie Handler für Routingereignisse anfügen, die von untergeordneten Elementen ausgelöst werden, ist dies so ähnlich wie der Gebrauch einer typename.eventname angefügten Ereignissyntax, obwohl es sich dabei genau genommen nicht um den Gebrauch eines angefügten Ereignisses handelt.Another syntax usage that resembles typename.eventname attached event syntax but is not strictly speaking an attached event usage is when you attach handlers for routed events that are raised by child elements. Fügen Sie die Handler an ein gemeinsames übergeordnetes Element an, um von Ereignisrouting zu profitieren, auch wenn das gemeinsame übergeordnete Element möglicherweise das relevante Routingereignis nicht als Member enthält.You attach the handlers to a common parent, to take advantage of event routing, even though the common parent might not have the relevant routed event as a member. Schauen Sie sich dieses Beispiel erneut an:Consider this example again:

<Border Height="50" Width="300" BorderBrush="Gray" BorderThickness="1">
  <StackPanel Background="LightGray" Orientation="Horizontal" Button.Click="CommonClickHandler">
    <Button Name="YesButton" Width="Auto" >Yes</Button>
    <Button Name="NoButton" Width="Auto" >No</Button>
    <Button Name="CancelButton" Width="Auto" >Cancel</Button>
  </StackPanel>
</Border>

Der Listener des übergeordneten Elements, in dem der Handler hinzugefügt wird, wird eine StackPanel.Here, the parent element listener where the handler is added is a StackPanel. Allerdings wird einen Handler für ein Routingereignis, der deklariert wurde und es wird ausgelöst durch Hinzufügen der Button Klasse (ButtonBase tatsächlich jedoch zur Button durch Vererbung).However, it is adding a handler for a routed event that was declared and will be raised by the Button class (ButtonBase actually, but available to Button through inheritance). Button "besitzt" das Ereignis, aber das System lässt Routingereignishandler für jedes beliebige Routingereignis an alle angefügt werden UIElement oder ContentElement Instanzlistener, der andernfalls Listener für Anhängen könnte eine Common Language Runtime (CLR)common language runtime (CLR) Ereignis.Button "owns" the event, but the routed event system permits handlers for any routed event to be attached to any UIElement or ContentElement instance listener that could otherwise attach listeners for a Common Language Runtime (CLR)common language runtime (CLR) event. Der Standard-xmlns-Namespace für diese qualifizierten Attributnamen ist in der Regel der Standard-WPFWPF-xmlns-Namespace, aber Sie können auch Namespaces mit Präfix für benutzerdefinierte Routingereignisse angeben.The default xmlns namespace for these qualified event attribute names is typically the default WPFWPF xmlns namespace, but you can also specify prefixed namespaces for custom routed events. Weitere Informationen zu xmlns finden Sie unter XAML-Namespaces und Namespacezuordnung für WPF-XAML.For more information about xmlns, see XAML Namespaces and Namespace Mapping for WPF XAML.

Eingabeereignisse in WPFWPF Input Events

Routingereignisse werden auf der WPFWPF-Plattform häufig für Eingabeereignisse verwendet.One frequent application of routed events within the WPFWPF platform is for input events. In WPFWPF erhalten Namen von Tunnelingroutingereignissen per Konvention das Wort „Preview“ (Vorschau) als Präfix.In WPFWPF, tunneling routed events names are prefixed with the word "Preview" by convention. Eingabeereignisse treten oft paarweise auf – wobei das eine ein Bubblingereignis und das andere ein Tunnelingereignis ist.Input events often come in pairs, with one being the bubbling event and the other being the tunneling event. Z. B. die KeyDown Ereignis und die PreviewKeyDown Ereignis haben die gleiche Signatur, wobei ersteres das Bubbling- und letzteres das tunneling von Eingabeereignissen.For example, the KeyDown event and the PreviewKeyDown event have the same signature, with the former being the bubbling input event and the latter being the tunneling input event. Manchmal haben Eingabeereignisse nur eine Bubblingversion oder nur eine direkte Routingversion.Occasionally, input events only have a bubbling version, or perhaps only a direct routed version. In der Dokumentation verweisen die Themen zu Routingereignissen auf ähnliche Routingereignisse mit alternativen Routingstrategien, falls derartige Routingereignisse vorhanden sind; Abschnitte auf den Seiten zu verwalteten Referenzen erläutern die Routingstrategien jedes Routingelements.In the documentation, routed event topics cross-reference similar routed events with alternative routing strategies if such routed events exist, and sections in the managed reference pages clarify the routing strategy of each routed event.

WPFWPF-Eingabeereignisse, die paarweise auftreten, werden implementiert, damit eine einzelne Benutzereingabeaktion, wie z.B. das Drücken einer Maustaste, beide Routingereignisse des Paars in der Sequenz auslöst.input events that come in pairs are implemented so that a single user action from input, such as a mouse button press, will raise both routed events of the pair in sequence. Zunächst wird das Tunnelingereignis ausgelöst und durchläuft seine Route.First, the tunneling event is raised and travels its route. Anschließend wird das Bubblingereignis ausgelöst und durchläuft seine Route.Then the bubbling event is raised and travels its route. Die beiden Ereignisse verwenden die gleiche Instanz der Ereignisdaten, da die RaiseEvent Methodenaufruf in der implementierenden Klasse, die das Bubblingereignis auslöst überwacht für die Ereignisdaten des tunnelingereignisses und in neuen, ausgelösten Ereignis.The two events literally share the same event data instance, because the RaiseEvent method call in the implementing class that raises the bubbling event listens for the event data from the tunneling event and reuses it in the new raised event. Listener mit Handlern für das Tunnelingereignis haben als Erstes die Möglichkeit, das Routingereignis als „handled“ zu markieren (zuerst Klassenhandler, anschließend Instanzhandler).Listeners with handlers for the tunneling event have the first opportunity to mark the routed event handled (class handlers first, then instance handlers). Wenn ein Element entlang der Tunnelingroute das Routingereignis als „handled“ markiert, werden die bereits behandelten Daten des Bubblingereignisses gesendet, und typische angefügte Handler für das entsprechende Bubblingeingabeereignis werden nicht aufgerufen.If an element along the tunneling route marked the routed event as handled, the already-handled event data is sent on for the bubbling event, and typical handlers attached for the equivalent bubbling input events will not be invoked. Nach außen wirkt dies so, als sei das behandelte Bubblingereignis nicht einmal ausgelöst worden.To outward appearances it will be as if the handled bubbling event has not even been raised. Dieses Behandlungsverhalten ist beim Zusammensetzen von Steuerelementen nützlich; hier möchten Sie möglicherweise, dass alle treffertestbasierten oder fokusbasierten Eingabeereignisse von Ihrem endgültigen Steuerelement gemeldet werden, und nicht von dessen einzelnen Komponenten.This handling behavior is useful for control compositing, where you might want all hit-test based input events or focus-based input events to be reported by your final control, rather than its composite parts. Das endgültige Steuerelement ist in der Zusammensetzung näher am Stamm, weshalb es das Tunnelingereignis zunächst in einer Klasse behandeln und eventuell sogar dieses Routingereignis durch ein steuerelementspezifischeres Ereignis „ersetzen“ kann – als Teil des Codes, der die Steuerelementklasse unterstützt.The final control element is closer to the root in the compositing, and therefore has the opportunity to class handle the tunneling event first and perhaps to "replace" that routed event with a more control-specific event, as part of the code that backs the control class.

Das folgende Beispiel für ein Eingabeereignis veranschaulicht das Verarbeiten von Eingabeereignissen.As an illustration of how input event processing works, consider the following input event example. In der folgenden Baumdiagramm ist leaf element #2 ist die Quelle der sowohl eine PreviewMouseDown und dann eine MouseDown Ereignis:In the following tree illustration, leaf element #2 is the source of both a PreviewMouseDown and then a MouseDown event:

Ereignisrouting-Diagramm

Ein Ereignis wird in folgender Reihenfolge verarbeitet:The order of event processing is as follows:

  1. PreviewMouseDown (Tunnel) auf dem Stammelement (root element)PreviewMouseDown (tunnel) on root element.

  2. PreviewMouseDown (Tunnel) auf dem ersten Zwischenelement (intermediate element #1)PreviewMouseDown (tunnel) on intermediate element #1.

  3. PreviewMouseDown (Tunnel) auf dem zweiten Zwischenelement (intermediate element #2)PreviewMouseDown (tunnel) on source element #2.

  4. MouseDown (Bubble) auf dem zweiten Quellelement (source element #2)MouseDown (bubble) on source element #2.

  5. MouseDown (Bubble) auf dem ersten Zwischenelement (intermediate element #1)MouseDown (bubble) on intermediate element #1.

  6. MouseDown (Bubble) auf dem Stammelement (root element)MouseDown (bubble) on root element.

Ein Delegat eines Routingereignishandlers enthält Verweise auf zwei Objekte: auf das Objekt, das das Ereignis ausgelöst hat und das Objekt, auf dem der Handler aufgerufen wurde.A routed event handler delegate provides references to two objects: the object that raised the event and the object where the handler was invoked. Das Objekt, auf dem der Handler aufgerufen wurde, ist das Objekt, das vom sender-Parameter gemeldet wurde.The object where the handler was invoked is the object reported by the sender parameter. Das Objekt, in dem das Ereignis erstmals ausgelöst, wird gemeldet, durch die Source Eigenschaft in den Ereignisdaten.The object where the event was first raised is reported by the Source property in the event data. Ein Ereignis dennoch ausgelöst und verarbeitet werden kann durch das gleiche Objekt in diesem Fall sender und Source identisch sind (Dies ist der Fall mit Schritt 3 und 4, die Verarbeitung in dieser Liste mit Beispielen).A routed event can still be raised and handled by the same object, in which case sender and Source are identical (this is the case with Steps 3 and 4 in the event processing example list).

Aufgrund von tunneling und bubbling erhalten übergeordnete Elemente Eingabeereignisse, in denen die Source ist eines der untergeordneten Elemente.Because of tunneling and bubbling, parent elements receive input events where the Source is one of their child elements. Wenn es wichtig ist zu wissen, was das Quellelement ist, können Sie das Quellelement identifizieren, indem Sie den Zugriff auf die Source Eigenschaft.When it is important to know what the source element is, you can identify the source element by accessing the Source property.

In der Regel, sobald das Eingabeereignis gekennzeichnet ist Handled, weitere Handler nicht aufgerufen werden.Usually, once the input event is marked Handled, further handlers are not invoked. In der Regel sollten Sie Eingabeereignisse als „handled“ markieren, sobald ein Handler aufgerufen wird, der Ihre anwendungsspezifische logische Behandlung der Bedeutung des Eingabeereignisses angeht.Typically, you should mark input events as handled as soon as a handler is invoked that addresses your application-specific logical handling of the meaning of the input event.

Die Ausnahme von dieser allgemeinen Aussage zum Handled Zustand ist, dass die Ereignishandler, die registriert werden, dass ignorieren Eingabe Handled Zustand der Daten für das Ereignis wird weiterhin auf beiden Routen aufgerufen werden.The exception to this general statement about Handled state is that input event handlers that are registered to deliberately ignore Handled state of the event data would still be invoked along either route. Weitere Informationen finden Sie unter Vorschauereignisse oder Markieren von Routingereignissen als behandelt und Klassenbehandlung.For more information, see Preview Events or Marking Routed Events as Handled, and Class Handling.

Das freigegebene Ereignisdatenmodell von Tunneling- und Bubblingereignissen und das sequenzielle Auslösen zunächst der Tunneling-und dann der Bubblingereignisse ist kein allgemein gültiges Konzept für alle Routingereignisse.The shared event data model between tunneling and bubbling events, and the sequential raising of first tunneling then bubbling events, is not a concept that is generally true for all routed events. Dieses Verhalten wird insbesondere davon implementiert, wie WPFWPF-Eingabegeräte Eingabeereignispaare auslösen und verbinden.That behavior is specifically implemented by how WPFWPF input devices choose to raise and connect the input event pairs. Das Implementieren Ihres eigenen Eingabeereignisses ist ein erweitertes Szenario; möglicherweise entscheiden Sie sich aber dazu, dieses Modell auch für Ihre eigenen Eingabeereignisse zu nutzen.Implementing your own input events is an advanced scenario, but you might choose to follow that model for your own input events also.

Gewisse Klassen behandeln gewisse Eingabeereignisse in einer Klasse, meist mit dem Ziel, die Bedeutung eines bestimmten benutzergesteuerten Eingabeereignisses innerhalb dieses Steuerelements neu zu definieren und ein neues Ereignis auszulösen.Certain classes choose to class-handle certain input events, usually with the intent of redefining what a particular user-driven input event means within that control and raising a new event. Weitere Informationen finden Sie unter Markieren von Routingereignissen als behandelt und Klassenbehandlung.For more information, see Marking Routed Events as Handled, and Class Handling.

Weitere Informationen zur Eingabe und zur Interaktion zwischen Eingabe und Ereignissen in normalen Anwendungsszenarien finden Sie unter Übersicht über die Eingabe.For more information on input and how input and events interact in typical application scenarios, see Input Overview.

EventSetters und EventTriggersEventSetters and EventTriggers

In Stilen, Sie können vordeklarierte XAMLXAML -Ereignisbehandlungssyntax in das Markup mit einem EventSetter.In styles, you can include some pre-declared XAMLXAML event handling syntax in the markup by using an EventSetter. Wenn das Format angewendet wird, wird der verwiesene Handler zur formatierten Instanz hinzugefügt.When the style is applied, the referenced handler is added to the styled instance. Sie können deklarieren, ein EventSetter nur für ein Routingereignis.You can declare an EventSetter only for a routed event. Nachfolgend finden Sie ein Beispiel:The following is an example. Beachten Sie, dass die b1SetColor-Methode, auf die hier verwiesen wird, sich in einer CodeBehind-Datei befindet.Note that the b1SetColor method referenced here is in a code-behind file.

<StackPanel
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.EventOvw2"
  Name="dpanel2"
  Initialized="PrimeHandledToo"
>
  <StackPanel.Resources>
    <Style TargetType="{x:Type Button}">
      <EventSetter Event="Click" Handler="b1SetColor"/>
    </Style>
  </StackPanel.Resources>
  <Button>Click me</Button>
  <Button Name="ThisButton" Click="HandleThis">
    Raise event, handle it, use handled=true handler to get it anyway.
  </Button>
</StackPanel>

Der Vorteil hierbei ist, dass das Format wahrscheinlich viel andere Informationen enthält, die auf eine beliebige Schaltfläche in der Anwendung angewendet werden können und dass die EventSetter Teil dieser Art fördert die Wiederverwendung von Code sogar auf Markupebene.The advantage gained here is that the style is likely to contain a great deal of other information that could apply to any button in your application, and having the EventSetter be part of that style promotes code reuse even at the markup level. Darüber hinaus eine EventSetter Methodennamen für Handler, die einen Schritt weg von der allgemeinen Anwendung und dem Seitenmarkup abstrahiert.Also, an EventSetter abstracts method names for handlers one step further away from the general application and page markup.

Weitere spezialisierte Syntax, die die geroutete Ereignis und Animation von kombiniert WPFWPF ist ein EventTrigger.Another specialized syntax that combines the routed event and animation features of WPFWPF is an EventTrigger. Wie bei EventSetter, nur Routingereignisse verwendet werden können, für eine EventTrigger.As with EventSetter, only routed events may be used for an EventTrigger. In der Regel ein EventTrigger ist als Teil eines Stils, deklariert jedoch EventTrigger können auch auf Seitenebene als Teil des deklariert werden die Triggers -Auflistung, oder in einer ControlTemplate.Typically, an EventTrigger is declared as part of a style, but an EventTrigger can also be declared on page-level elements as part of the Triggers collection, or in a ControlTemplate. Ein EventTrigger ermöglicht Ihnen die Angabe einer Storyboard , ausgeführt wird, wenn ein Routingereignis ein Element in der Route erreicht deklariert eine EventTrigger für dieses Ereignis.An EventTrigger enables you to specify a Storyboard that runs whenever a routed event reaches an element in its route that declares an EventTrigger for that event. Der Vorteil des ein EventTrigger über nur behandeln des Ereignisses und, startet ein vorhandenes Storyboard ist, eine EventTrigger bietet bessere Kontrolle über das Storyboard und dessen Laufzeitverhalten.The advantage of an EventTrigger over just handling the event and causing it to start an existing storyboard is that an EventTrigger provides better control over the storyboard and its run-time behavior. Weitere Informationen finden Sie unter Verwenden von Ereignistriggern zum Steuern eines Storyboards nach dessen Start.For more information, see Use Event Triggers to Control a Storyboard After It Starts.

Weitere Informationen zu RoutingereignissenMore About Routed Events

In diesem Thema werden hauptsächlich die grundlegenden Konzepte von Routingereignissen erläutert; zudem bietet er Ihnen eine Orientierung, wann Sie auf Routingereignisse reagieren sollten, die bereits in den verschieden Basiselementen und -steuerelementen vorhanden sind.This topic mainly discusses routed events from the perspective of describing the basic concepts and offering guidance on how and when to respond to the routed events that are already present in the various base elements and controls. Allerdings können Sie eigene Routingereignis für Ihre benutzerdefinierte Klasse mit den notwendigen Hilfsmitteln, wie z. B. spezialisierte Ereignisdatenklassen und Delegaten, erstellen.However, you can create your own routed event on your custom class along with all the necessary support, such as specialized event data classes and delegates. Eigentümer des Routingereignisses kann jede Klasse sein, aber die Routingereignisse müssen ausgelöst und behandelt, indem UIElement oder ContentElement abgeleiteten Klassen, damit Sie nützlich ist.The routed event owner can be any class, but routed events must be raised by and handled by UIElement or ContentElement derived classes in order to be useful. Weitere Informationen zu benutzerdefinierten Ereignissen finden Sie unter Erstellen eines benutzerdefinierten Routingereignisses.For more information about custom events, see Create a Custom Routed Event.

Siehe auchSee also