Ü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.

Erforderliche VoraussetzungenPrerequisites

In diesem Thema wird davon ausgegangen, dass Sie über grundlegende Kenntnisse der Common Language Runtime (CLR) und der objektorientierten Programmierung verfügen. Außerdem wird erläutert, wie die Beziehungen zwischen WPFWPF Elementen als Baumstruktur verstanden werden können.This topic assumes that you have basic knowledge of the 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-Desktop Anwendung und Übersicht über XAML (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 Ereignis, das Ereignishandler auf mehreren Listenern in einer Elementstruktur aufrufen kann, und nicht nur auf dem 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.

Implementierungs Definition: ein Routing Ereignis ist ein CLR-Ereignis, das von einer Instanz der RoutedEvent-Klasse unterstützt wird und vom Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF)-Ereignis System verarbeitet wird.Implementation definition: A routed event is a CLR 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:

Schaltflächen Ja, Nein und AbbrechenYes, No, and Cancel buttons

In dieser vereinfachten Elementstruktur ist die Quelle eines Click Ereignisses eines der Button Elemente, und je nachdem, auf Button geklickt wurde, ist das erste Element, das die Möglichkeit hat, das Ereignis zu behandeln.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. Wenn jedoch kein an den Button angefügter Handler für das-Ereignis verwendet wird, wird das-Ereignis in der Elementstruktur nach oben bis zum Button übergeordnet, d. h. als 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. Das Ereignis wird möglicherweise zu Borderund dann über den Seiten Stamm der Elementstruktur hinaus (nicht angezeigt).Potentially, the event bubbles to Border, and then beyond to the page root of the element tree (not shown).

Anders ausgedrückt: die Ereignis Route für dieses Click Ereignis lautet wie folgt: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 finden Sie eine kurze Zusammenfassung der Szenarien, die das Routing Ereignis Konzept motiviert haben, und warum ein typisches CLR-Ereignis für diese Szenarien nicht geeignet war:The following is a brief summary of the scenarios that motivated the routed event concept, and why a typical CLR event was not adequate for these scenarios:

Zusammensetzung und Kapselung von Steuerelementen: Verschiedene Steuerelemente in WPFWPF verfügen über ein umfangreiches Inhaltsmodell.Control composition and encapsulation: Various controls in WPFWPF have a rich content model. Beispielsweise können Sie ein Bild in einer Buttonplatzieren, wodurch die visuelle Struktur der Schaltfläche effektiv erweitert wird.For example, you can place an image inside of a Button, which effectively extends the visual tree of the button. Das hinzugefügte Image darf jedoch das Treffer Testverhalten nicht unterbrechen, das bewirkt, dass eine Schaltfläche auf eine Click des Inhalts antwortet, auch wenn der Benutzer auf Pixel klickt, die in technischer Hinsicht 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 Handler: In Windows FormsWindows Forms müssen Sie den gleichen Handler mehrmals zur Verarbeitung der Ereignisse anfügen, die von 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 akzeptieren einen statischen Handler, der 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 Routing Ereignis erstellt ein RoutedEvent Feld als Bezeichner, der eine robuste Ereignis Identifikationstechnik bereitstellt, die keine statische oder Lauf Zeit Reflektion erfordert.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 Routing Ereignis ist ein CLR-Ereignis, das von einer Instanz der RoutedEvent-Klasse unterstützt und beim WPFWPF-Ereignis System registriert wird.A routed event is a CLR event that is backed by an instance of the RoutedEvent class and registered with the WPFWPF event system. Die RoutedEvent Instanz, die von der Registrierung abgerufen wird, wird in der Regel als public static readonly Feldmember der Klasse aufbewahrt, die das Routing Ereignis registriert und somit "besitzt".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 CLR-Ereignis (das manchmal als "Wrapper"-Ereignis bezeichnet wird) wird durch Überschreiben der add-und remove Implementierungen für das CLR-Ereignis erreicht.The connection to the identically named CLR event (which is sometimes termed the "wrapper" event) is accomplished by overriding the add and remove implementations for the CLR 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. Der Unterstützungs-und Verbindungs Mechanismus des Routing Ereignisses ähnelt konzeptionell der Art und Weise, wie eine Abhängigkeits Eigenschaft eine CLR-Eigenschaft ist, die von der DependencyProperty-Klasse unterstützt und beim WPFWPF-Eigenschaften System registriert wird.The routed event backing and connection mechanism is conceptually similar to how a dependency property is a CLR property that is backed by the DependencyProperty class and registered with the WPFWPF property system.

Das folgende Beispiel zeigt die Deklaration für ein benutzerdefiniertes Tap Routing Ereignis, einschließlich der Registrierung und dem verfügbar machen des RoutedEvent Bezeichnerfelds und der add-und remove-Implementierungen für das Tap CLR-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 CLR 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 CLR-Standard Ereignis Handlern ist für das Hinzufügen von Routing Ereignis Handlern identisch, da Sie dem CLR-Ereignis Wrapper, der über eine Routing Ereignis-Implementierung verfügt, tatsächlich Handler hinzufügen.The XAMLXAML syntax for adding standard CLR event handlers is the same for adding routed event handlers, because you are really adding handlers to the CLR 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: Ereignishandler werden auf der Ereignisquelle 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 kann als 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 einem Standard-CLR-Ereignis unterstützen direkte Routing Ereignisse jedoch die Klassen Behandlung (die Klassen Behandlung wird in einem zukünftigen Abschnitt erläutert) und können von EventSetter und EventTriggerverwendet werden.However, unlike a standard CLR 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 der 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 können ein Ereignislistener für ein beliebiges Routing Ereignis sein.Any UIElement or ContentElement can be an event listener for any routed event. Aus diesem Grund können Sie den vollständigen Satz von Routing Ereignissen, die im gesamten funktionierenden API-Satz verfügbar sind, als konzeptionelle "Schnittstelle" verwenden, bei der unterschiedliche Elemente in der Anwendung Ereignis Informationen 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.

Außer dem Routing Aspekt gibt es zwei andere Gründe, dass ein bestimmtes WPFWPF Ereignis anstelle eines CLR-Standard Ereignisses als Routing Ereignis implementiert werden kann.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 CLR 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 Formatierungs-und Vorlagen Funktionen wie EventSetter und EventTrigger erfordern, dass das referenzierte Ereignis ein Routing Ereignis 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 ist der Name des implementierten Handlers, der den Code enthält, der das Click Ereignis behandelt.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 Delegat aufweisen, der der Ereignishandlerdelegat für das Click Ereignis ist.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 der einfache Routing Ereignishandler-Delegat.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. Beispielsweise können Sie in einem allgemeinen Eingabe Szenario ein DragEnter Routing Ereignis behandeln.For instance, in a common input scenario, you might handle a DragEnter routed event. Der Handler muss den DragEventHandler-Delegaten implementieren.Your handler should implement the DragEventHandler delegate. Mit dem spezifischsten Delegaten können Sie die DragEventArgs im-Handler verarbeiten und die Data-Eigenschaft lesen, die die Zwischenablage Nutzlast des Zieh Vorgangs 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. Routing Ereignishandler können immer über eine Hilfsmethode hinzugefügt werden AddHandler (bei der es sich um dieselbe Methode handelt, die der vorhandene Backup-Aufruf add.) Vorhandene WPFWPF Routing Ereignisse verfügen jedoch im Allgemeinen über Unterstützungs Implementierungen add und remove Logik, mit der die Handler für Routing Ereignisse durch eine sprachspezifische Ereignis Syntax hinzugefügt werden können. Dies ist eine intuitivere Syntax 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 nächste Beispiel zeigt die C# Operator Syntax (Visual Basic hat aufgrund ihrer Behandlung der Dereferenzierung eine etwas andere Operator Syntax):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 das Handles-Schlüsselwort verwenden, um Handler als Teil der Handlerdeklarationen hinzuzufü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 Routing Ereignisse haben 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 annimmt.RoutedEventArgs defines the Handled property, which takes a Boolean value. Der Zweck der Handled Eigenschaft besteht darin, jeden Ereignishandler entlang der Route zu aktivieren, um das Routing Ereignis als behandeltzu markieren, indem der Wert von Handled auf truefestgelegt wird.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 von Handled wirkt sich darauf aus, wie ein Routing Ereignis während der Weiterleitung entlang der Route gemeldet oder verarbeitet wird.The value of Handled affects how a routed event is reported or processed as it travels further along the route. Wenn Handled in den Ereignisdaten für ein Routing Ereignis true wird, werden die Handler, die auf dieses Routing Ereignis für andere Elemente lauschen, in der Regel nicht mehr für diese bestimmte Ereignis Instanz aufgerufen.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. Bei den meisten gängigen handlerszenarios führt das Markieren eines Ereignisses als behandelt durch Festlegen von Handled auf true das Routing entweder für eine tunnelingroute oder eine bubblingerroute und auch für alle Ereignisse, die an einem Punkt in der Route von einem Klassen Handler behandelt werden.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 gibt jedoch einen "shanddeventstoo"-Mechanismus, bei dem Listener weiterhin Handler als Antwort auf Routing Ereignisse ausführen können, bei denen Handled in den Ereignisdaten true ist.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 nur den "Lenker-deventstoo"-Mechanismus im Code oder in einem EventSetterverwenden:You can only use the handledEventsToo mechanism in code, or in an EventSetter:

Zusätzlich zu dem Verhalten, das Handled Status in gerouteten Ereignissen erzeugt, wirkt sich das Konzept von Handled auf die Art und Weise aus, wie Sie Ihre Anwendung entwerfen und den Ereignishandlercode schreiben müssen.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 Handled als einfaches Protokoll konzeptionalisieren, das von Routing Ereignissen verfügbar gemacht wird.You can conceptualize Handled as being a simple protocol that is exposed by routed events. Wie Sie dieses Protokoll verwenden, ist für Sie von nutzen, aber der konzeptionelle Entwurf für die Verwendung des Werts Handled ist 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 Routing Ereignis nicht als behandelt markiert ist, haben andere Listener, die sich weiter oben entlang der Route befanden, fest, dass kein Handler registriert werden soll, oder die registrierten Handler haben sich entschieden, die Ereignisdaten nicht zu bearbeiten und Handled auf truefestzulegen.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 natürlich auch möglich, dass der aktuelle Listener der erste Punkt in der Route ist.) Handler auf dem aktuellen Listener verfügen nun über drei mögliche Aktions Kurse:(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 leitet weiterhin an den nächsten Listener weiter, aber mit Handled=true in seinen Ereignisdaten, sodass nur handledEventsToo Listener weitere Handler aufrufen können.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.

Dieses konzeptionelle Design wird durch das zuvor erwähnte Routing Verhalten verstärkt: Es ist schwieriger (obwohl es im Code oder in Stilen immer noch möglich ist), Handler für Routing Ereignisse anzufügen, die aufgerufen werden, auch wenn ein vorheriger Handler entlang der Route bereits festgelegt wurde Handled zum 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 Handled, Klassen Behandlung von Routing Ereignissen sowie Empfehlungen dazu, wann ein Routing Ereignis als Handledmarkiert werden kann, finden Sie unter Markieren von Routing Ereignissen als behandelt und Klassen Behandlung.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 Klasse definieren, die von DependencyObjectauf irgendeine Weise abgeleitet ist, können Sie auch einen Klassen Handler für ein Routing Ereignis definieren und anfügen, das ein deklarierter oder geerbte Ereignismember der 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. Beispielsweise kann das zugrunde liegende angefügte Ereignis Mouse.MouseDown auf allen gegebenen UIElement leichter behandelt werden, indem MouseDown auf diesem UIElement verwendet wird, anstatt mit der Syntax angefügter Ereignisse entweder in XAMLXAML oder Code umzugehen.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>

Hier ist der übergeordnete Element Listener, dem der Handler hinzugefügt wird, ein StackPanel.Here, the parent element listener where the handler is added is a StackPanel. Es wird jedoch ein Handler für ein Routing Ereignis hinzugefügt, das deklariert wurde und von der Button-Klasse ausgelöst wird (ButtonBase tatsächlich, aber zum Button durch Vererbung verfügbar ist).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 Routing Ereignis System gestattet, dass Handler für beliebige Routing Ereignisse an beliebige UIElement oder ContentElement Instanzlistener angefügt werden, die andernfalls Listener für ein Common Language Runtime Ereignis (CLR) anfügen können.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) 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. Beispielsweise haben das KeyDown Ereignis und das PreviewKeyDown-Ereignis die gleiche Signatur, wobei das erste-Ereignis das bubblingangabeereignis und letzteres das tunnelingeingabeereignis ist.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 buchstäblich dieselbe Ereignisdaten Instanz, da der RaiseEvent-Methodenaufrufe in der implementierenden Klasse, die das Bubblingereignis auslöst, auf die Ereignisdaten aus dem tunnelingereignis lauscht und diese im neuen ausgelösten Ereignis wieder verwendet.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 Struktur Abbildung ist leaf element #2 die Quelle sowohl eines PreviewMouseDown als auch eines MouseDown Ereignisses: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 zuerst ausgelöst wurde, wird von der Source-Eigenschaft in den Ereignisdaten gemeldet.The object where the event was first raised is reported by the Source property in the event data. Ein Routing Ereignis kann immer noch vom gleichen Objekt ausgelöst und behandelt werden. in diesem Fall sind sender und Source identisch (Dies ist der Fall mit den Schritten 3 und 4 in der Beispielliste Ereignisverarbeitung).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 Tunnelung und Blasen empfangen übergeordnete Elemente Eingabeereignisse, bei denen die Source eines ihrer untergeordneten Elemente ist.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 Quell Element ist, können Sie das Quell Element durch Zugriff auf die Source-Eigenschaft identifizieren.When it is important to know what the source element is, you can identify the source element by accessing the Source property.

Wenn das Eingabe Ereignis als Handledgekennzeichnet ist, werden in der Regel keine weiteren Handler aufgerufen.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.

Eine Ausnahme von dieser allgemeinen Anweisung über Handled Status ist, dass Eingabe Ereignishandler, die registriert werden, um den Handled Zustand der Ereignisdaten absichtlich zu ignorieren, auch 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 können Sie eine vordeklarierte XAMLXAML Ereignis Behandlungs Syntax in das Markup einschließen, indem Sie eine-EventSetterverwenden.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 eine EventSetter nur für ein Routing Ereignis deklarieren.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 besteht darin, dass der Stil wahrscheinlich viele andere Informationen enthält, die auf jede Schaltfläche in der Anwendung angewendet werden können, und die EventSetter Teil dieses Stils sind, um die Wiederverwendung von Code sogar auf Markup Ebene zu fördern.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. Außerdem abstrahiert ein EventSetter Methodennamen für Handler einen Schritt weiter Weg von der allgemeinen Anwendung und dem Seiten Markup.Also, an EventSetter abstracts method names for handlers one step further away from the general application and page markup.

Eine weitere spezielle Syntax, die das Routing Ereignis und die Animations Funktionen von WPFWPF kombiniert, ist ein EventTrigger.Another specialized syntax that combines the routed event and animation features of WPFWPF is an EventTrigger. Wie bei EventSetterkönnen nur Routing Ereignisse für eine EventTriggerverwendet werden.As with EventSetter, only routed events may be used for an EventTrigger. In der Regel wird ein EventTrigger als Teil eines Stils deklariert, aber ein EventTrigger kann auch für Elemente auf Seitenebene als Teil der Triggers Auflistung oder in einer ControlTemplatedeklariert werden.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. Mit einem EventTrigger können Sie eine Storyboard angeben, die immer dann ausgeführt wird, wenn ein Routing Ereignis ein Element in seiner Route erreicht, das eine EventTrigger für dieses Ereignis deklariert.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 einer EventTrigger, nur das Ereignis zu behandeln und ein vorhandenes Storyboard zu starten, besteht darin, dass ein EventTrigger eine bessere Kontrolle über das Storyboard und dessen Laufzeitverhalten bietet.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. Der Besitzer des Routing Ereignisses kann eine beliebige Klasse sein, aber Routing Ereignisse müssen von UIElement oder ContentElement abgeleiteten Klassen ausgelöst und behandelt werden, um nützlich zu sein.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