Comment : créer un événement routé personnalisé

Pour que votre événement personnalisé prend en charge le routage des événements, vous devez inscrire une RoutedEvent méthode à l’aide de la RegisterRoutedEvent méthode. Cet exemple montre les principes de base de la création d’un événement routé personnalisé.

Exemple

Comme illustré dans l’exemple suivant, vous inscrivez d’abord une RoutedEvent méthode à l’aide de la RegisterRoutedEvent méthode. Par convention, le RoutedEvent nom du champ statique doit se terminer par l’événement de suffixe. Dans cet exemple, le nom de l’événement est Tap et la stratégie de routage de l’événement est Bubble. Après l’appel d’inscription, vous pouvez fournir des accesseurs d’événements CLR (Common Language Runtime) add-and-remove pour l’événement.

Notez que, même si l’événement est déclenché au moyen de la méthode virtuelle OnTap dans cet exemple, la manière dont vous déclenchez votre événement ou dont votre événement répond aux modifications dépend de vos besoins.

Notez également que cet exemple implémente essentiellement une sous-classe entière de Button; cette sous-classe est générée en tant qu’assembly distinct, puis instanciée en tant que classe personnalisée sur une page XAML distincte. Il s’agit d’illustrer le concept que les contrôles sous-classés peuvent être insérés dans des arborescences composées d’autres contrôles, et que, dans ce cas, les événements personnalisés sur ces contrôles ont les mêmes fonctionnalités de routage des événements que n’importe quel élément WPF natif.

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>

Les événements de tunneling sont créés de la même façon, mais avec RoutingStrategy la valeur définie Tunnel dans l’appel d’inscription. Par convention, les événements de tunneling dans WPF sont précédés du mot « Aperçu ».

Pour voir un exemple du fonctionnement des événements de propagation, consultez Guide pratique pour gérer un événement routé.

Voir aussi