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 bulle et utilise l’événement ButtonBase.Click pour montrer le fonctionnement du routage.

L’exemple suivant crée deux Button contrôles et utilise la syntaxe d’attribut XAML pour attacher un gestionnaire d’événements à un élément parent commun, qui, dans cet exemple, est StackPanel. Au lieu d’attacher des gestionnaires d’événements individuels pour chaque Button élément enfant, l’exemple utilise la syntaxe d’attribut pour attacher le gestionnaire d’événements à l’élément StackPanel parent. Ce modèle de gestion des événements indique comment utiliser le routage d’événement afin de réduire le nombre d’éléments attachés à un gestionnaire. Tous les événements de bubbling pour chaque Button route via l’élément parent.

Notez que sur l’élément parent StackPanel , le Click nom de l’événement spécifié en tant qu’attribut est partiellement qualifié en nommant la Button classe. La Button classe est une ButtonBase classe dérivée qui a l’événement Click dans sa liste de membres. 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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://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é quand l’utilisateur clique sur l’un des boutons.

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();
    }
}
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

Voir aussi