Comment : créer un événement routé personnalisé
Pour que votre événement personnalisé prenne en charge le routage d'événement, vous devez enregistrer un RoutedEvent à l'aide de la méthode RegisterRoutedEvent. Cet exemple montre les principes de base de la création d'un événement routé personnalisé.
Exemple
Comme illustré dans l'exemple suivant, enregistrez d'abord un RoutedEvent à l'aide de la méthode RegisterRoutedEvent. Par convention, le nom de champ statique RoutedEvent doit se terminer par le suffixe Event. Dans cet exemple, l'événement porte le nom 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énement common language runtime (CLR) ajout/suppression pour l'événement.
Notez que même si, dans cet exemple, l'événement est déclenché au moyen de la méthode virtuelle OnTap, 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 fondamentalement toute une sous-classe de Button ; cette sous-classe est construite comme un assembly distinct, puis est instanciée comme une classe personnalisée d'une page Extensible Application Markup Language (XAML) distincte. Pour illustrer le concept, les contrôles sous-classés peuvent être insérés dans des arborescences composées d'autres contrôles. Dans cette situation, les événements personnalisés de ces contrôles ont exactement les mêmes fonctionnalités de routage d'événements que tout élément Windows Presentation Foundation (WPF) natif.
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
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();
}
}
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://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 manière, mais avec RoutingStrategy ayant la valeur Tunnel dans l'appel d'inscription. Par convention, les événements de tunneling dans WPF sont précédés du préfixe « Preview ».
Pour voir un exemple du fonctionnement des événements de propagation, consultez Comment : gérer un événement routé.