Udostępnij za pośrednictwem


Jak utworzyć niestandardowe zdarzenie trasowane

Aby zdarzenie niestandardowe obsługiwało routing zdarzeń, należy zarejestrować RoutedEvent go przy użyciu RegisterRoutedEvent metody . W tym przykładzie przedstawiono podstawy tworzenia niestandardowego zdarzenia kierowanego.

Przykład

Jak pokazano w poniższym przykładzie, najpierw zarejestrujesz metodę RoutedEvent RegisterRoutedEvent przy użyciu metody . Zgodnie z konwencją RoutedEvent nazwa pola statycznego powinna kończyć się sufiksem Zdarzenie. W tym przykładzie nazwa zdarzenia to Tap , a strategia routingu zdarzenia to Bubble. Po wywołaniu rejestracji można podać akcesory zdarzeń środowiska uruchomieniowego języka wspólnego (CLR) add-and-remove dla zdarzenia.

Należy pamiętać, że mimo że zdarzenie jest wywoływane za pośrednictwem OnTap metody wirtualnej w tym konkretnym przykładzie, sposób zgłaszania zdarzenia lub reagowanie na zmiany zależy od potrzeb.

Należy również pamiętać, że ten przykład zasadniczo implementuje całą podklasę ; ta podklasa Buttonjest kompilowana jako oddzielny zestaw, a następnie tworzona jako klasa niestandardowa na oddzielnej stronie XAML. To jest zilustrowanie koncepcji, że podklasowane kontrolki można wstawić do drzew składających się z innych kontrolek, a w tej sytuacji zdarzenia niestandardowe na tych kontrolkach mają takie same możliwości routingu zdarzeń, jak każdy natywny element WPF.

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 ustawioną wartością RoutingStrategy Tunnel w wywołaniu rejestracji. Zgodnie z konwencją zdarzenia tunelowania w WPF są poprzedzone słowem "Wersja zapoznawcza".

Aby zobaczyć przykład działania zdarzeń bubbling, zobacz Handle a Routed Event (Obsługa zdarzenia trasowanego).

Zobacz też