Freigeben über


Vorgehensweise: Erstellen eines benutzerdefinierten Routingereignisses

Damit Ihr benutzerdefiniertes Ereignis das Ereignisrouting unterstützt, müssen Sie eine RoutedEvent mithilfe der RegisterRoutedEvent-Methode registrieren. In diesem Beispiel werden die Grundlagen des Erstellens eines benutzerdefinierten Routingereignisses veranschaulicht.

Beispiel

Wie im folgenden Beispiel gezeigt, registrieren Sie zunächst eine RoutedEvent mithilfe der RegisterRoutedEvent-Methode. Üblicherweise sollte der Name des statischen Felds RoutedEvent mit dem Suffix Eventenden. In diesem Beispiel sind der Name des Ereignisses Tap und die Routingstrategie des Ereignisses Bubble. Nach dem Registrierungsaufruf können Sie Add-and-Remove Common Language Runtime (CLR)-Ereignisaccessoren für das Ereignis bereitstellen.

Beachten Sie, dass das Ereignis zwar über die OnTap-virtuelle Methode in diesem bestimmten Beispiel ausgelöst wird, die Art und Weise, wie Sie Ihr Ereignis auslösen oder darauf reagieren, hängt jedoch von Ihren Anforderungen ab.

Beachten Sie auch, dass in diesem Beispiel grundsätzlich eine ganze Unterklasse von Buttonimplementiert wird; diese Unterklasse wird als separate Assembly erstellt und dann als benutzerdefinierte Klasse auf einer separaten XAML-Seite instanziiert. Dies ist die Veranschaulichung des Konzepts, dass unterklassige Steuerelemente in Strukturen eingefügt werden können, die aus anderen Steuerelementen bestehen, und dass in dieser Situation benutzerdefinierte Ereignisse für diese Steuerelemente über die gleichen Ereignisroutingfunktionen verfügen wie jedes systemeigene WPF-Element.

public class MyButtonSimple: Button
{
    // Create a custom routed event by first registering a RoutedEventID
    // This event uses the bubbling routing strategy
    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); }
    }

    // This method raises the Tap event
    void RaiseTapEvent()
    {
            RoutedEventArgs newEventArgs = new RoutedEventArgs(MyButtonSimple.TapEvent);
            RaiseEvent(newEventArgs);
    }
    // For demonstration purposes we raise the event when the MyButtonSimple is clicked
    protected override void OnClick()
    {
        RaiseTapEvent();
    }
}
Public Class MyButtonSimple
    Inherits Button

    ' Create a custom routed event by first registering a RoutedEventID
    ' This event uses the bubbling routing strategy
    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

    ' This method raises the Tap event
    Private Sub RaiseTapEvent()
        Dim newEventArgs As New RoutedEventArgs(MyButtonSimple.TapEvent)
        MyBase.RaiseEvent(newEventArgs)
    End Sub

    ' For demonstration purposes we raise the event when the MyButtonSimple is clicked
    Protected Overrides Sub OnClick()
        Me.RaiseTapEvent()
    End Sub

End Class
<Window  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:custom="clr-namespace:SDKSample;assembly=SDKSampleLibrary"
    x:Class="SDKSample.RoutedEventCustomApp"

    >
    <Window.Resources>
      <Style TargetType="{x:Type custom:MyButtonSimple}">
        <Setter Property="Height" Value="20"/>
        <Setter Property="Width" Value="250"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="Background" Value="#808080"/>
      </Style>
    </Window.Resources>
    <StackPanel Background="LightGray">
        <custom:MyButtonSimple Name="mybtnsimple" Tap="TapHandler">Click to see Tap custom event work</custom:MyButtonSimple>
    </StackPanel>
</Window>

Tunnelereignisse werden auf die gleiche Weise erstellt, jedoch wird RoutingStrategy im Registrierungsaufruf auf Tunnel gesetzt. Standardmäßig werden Tunnelereignisse in WPF dem Wort "Vorschau" vorangestellt.

Ein Beispiel für die Funktionsweise von Bubblingereignissen finden Sie unter Handle a Routed Event.

Siehe auch