Jak utworzyć niestandardowe zdarzenie trasowane

Aby niestandardowe zdarzenie obsługiwało routing zdarzeń, należy zarejestrować RoutedEvent za pomocą RegisterRoutedEvent metody. W tym przykładzie przedstawiono podstawowe informacje na temat tworzenia niestandardowego zdarzenia kierowanego.

Przykład

Jak pokazano w poniższym przykładzie, należy najpierw zarejestrować RoutedEvent metodę przy użyciu RegisterRoutedEvent metody. Zgodnie z Konwencją RoutedEvent Nazwa pola statycznego powinna kończyć się zdarzeniem sufiksu. W tym przykładzie nazwa zdarzenia to Tap i strategia routingu zdarzenia Bubble . Po wywołaniu rejestracji można dostarczyć dla zdarzenia metody dostępu do zdarzeń środowiska uruchomieniowego języka wspólnego (CLR).

Należy zauważyć, że mimo że zdarzenie jest zgłaszane przez OnTap metodę wirtualną w tym konkretnym przykładzie, jak podnieść wydarzenie lub wpływ zdarzenia na zmiany zależy od Twoich potrzeb.

Należy zauważyć, że ten przykład zasadniczo implementuje całą podklasę Button ; Ta podklasa jest tworzona jako oddzielny zestaw, a następnie tworzona jako Klasa niestandardowa na osobnej Extensible Application Markup Language (XAML) stronie. Jest to zilustrowanie koncepcji, które podklasy kontrolki mogą być wstawiane do drzew składających się z innych kontrolek, a w takiej sytuacji niestandardowe zdarzenia na tych kontrolkach mają takie same możliwości routingu zdarzeń jak każdy Windows Presentation Foundation (WPF) element macierzysty.

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>

Zdarzenia tunelowania są tworzone w taki sam sposób, ale z RoutingStrategy ustawionym na wartość Tunnel w wywołaniu rejestracji. Zgodnie z Konwencją, tunelowanie zdarzeń w programie WPF jest poprzedzone wyrazem "Preview".

Aby zapoznać się z przykładem działania propagacji zdarzeń, zobacz temat Obsługa zdarzenia kierowanego.

Zobacz też