Comment : gérer un événement routé

Cet exemple illustre le fonctionnement des événements de propagation et indique comment écrire un gestionnaire permettant de traiter les données des événements routés.

Exemple

Dans Windows Presentation Foundation (WPF), les éléments sont organisés dans une arborescence d'éléments. L'élément parent peut participer à la gestion des événements déclenchés initialement par les éléments enfants dans l'arborescence d'éléments. Ceci est possible grâce au routage d'événement.

En règle générale, les événements routés respectent l'une des deux stratégies de routage : propagation ou tunneling. Cet exemple se concentre sur l'événement de propagation et utilise l'événement ButtonBase.Click pour indiquer le fonctionnement du routage.

L'exemple suivant crée deux contrôles Button et utilise la syntaxe d'attribut XAML pour attacher un gestionnaire d'événements à un élément parent commun (dans cet exemple, StackPanel). Au lieu d'attacher un gestionnaire d'événements à chaque élément enfant Button, l'exemple utilise la syntaxe d'attribut pour attacher le gestionnaire d'événements à l'élément parent StackPanel. Ce modèle de gestion des événements indique comment utiliser le routage d'événements afin de réduire le nombre d'éléments attachés à un gestionnaire. Tous les événements de propagation de chaque Button passent par l'élément parent.

Sur l'élément parent StackPanel, le nom de l'événement Click spécifié comme attribut est partiellement qualifié en nommant la classe Button. La classe Button est une classe dérivée ButtonBase dont la liste de membres comporte l'événement Click. Cette technique de qualification partielle permettant d'attacher un gestionnaire d'événements est nécessaire si l'événement géré n'existe pas dans la liste de membres de l'élément auquel le gestionnaire d'événements routés est attaché.

<StackPanel
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.RoutedEventHandle"
  Name="dpanel"
  Button.Click="HandleClick"
>
  <StackPanel.Resources>
      <Style TargetType="{x:Type Button}">
        <Setter Property="Height" Value="20"/>
        <Setter Property="Width" Value="250"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
      </Style>
  </StackPanel.Resources>
  <Button Name="Button1">Item 1</Button>
  <Button Name="Button2">Item 2</Button>
  <TextBlock Name="results"/>
</StackPanel>

L'exemple suivant gère l'événement Click. L'exemple signale l'élément qui gère l'événement, ainsi que l'élément qui déclenche l'événement. Le gestionnaire d'événements est exécuté lorsque l'utilisateur clique sur l'un des boutons.

Private eventstr As New Text.StringBuilder()

Private Sub HandleClick(ByVal sender As Object, ByVal args As RoutedEventArgs)
    ' Get the element that handled the event.
    Dim fe As FrameworkElement = DirectCast(sender, FrameworkElement)
    eventstr.Append("Event handled by element named ")
    eventstr.Append(fe.Name)
    eventstr.Append(vbLf)

    ' Get the element that raised the event. 
    Dim fe2 As FrameworkElement = DirectCast(args.Source, FrameworkElement)
    eventstr.Append("Event originated from source element of type ")
    eventstr.Append(args.Source.[GetType]().ToString())
    eventstr.Append(" with Name ")
    eventstr.Append(fe2.Name)
    eventstr.Append(vbLf)

    ' Get the routing strategy.
    eventstr.Append("Event used routing strategy ")
    eventstr.Append(args.RoutedEvent.RoutingStrategy)
    eventstr.Append(vbLf)

    results.Text = eventstr.ToString()
End Sub
public partial class RoutedEventHandle : StackPanel
{
    StringBuilder eventstr = new StringBuilder();
    void HandleClick(object sender, RoutedEventArgs args)
    {
        // Get the element that handled the event.
        FrameworkElement fe = (FrameworkElement)sender;
        eventstr.Append("Event handled by element named ");
        eventstr.Append(fe.Name);
        eventstr.Append("\n");

        // Get the element that raised the event. 
        FrameworkElement fe2 = (FrameworkElement)args.Source;
        eventstr.Append("Event originated from source element of type ");
        eventstr.Append(args.Source.GetType().ToString());
        eventstr.Append(" with Name ");
        eventstr.Append(fe2.Name);
        eventstr.Append("\n");

        // Get the routing strategy.
        eventstr.Append("Event used routing strategy ");
        eventstr.Append(args.RoutedEvent.RoutingStrategy);
        eventstr.Append("\n");

        results.Text = eventstr.ToString();
    }
}

Voir aussi

Référence

RoutedEvent

Concepts

Vue d'ensemble des entrées

Vue d'ensemble des événements routés

Syntaxe XAML en détail

Autres ressources

Rubriques "Comment" relatives aux événements

Historique des modifications

Date

Historique

Motif

Juillet 2010

Ajout d'un exemple pour le gestionnaire d'événements.

Commentaires client.