Condividi tramite


Procedura: gestire un evento indirizzato

In questo esempio viene illustrato il funzionamento degli eventi bubbling e come scrivere un gestore in grado di elaborare i dati dell'evento indirizzato.

Esempio

In Windows Presentation Foundation (WPF), gli elementi sono disposti in una struttura ad albero dell'elemento. L'elemento padre può partecipare alla gestione di eventi inizialmente generati dagli elementi figlio nella struttura ad albero dell'elemento. Questo è possibile grazie al routing degli eventi.

Per gli eventi indirizzati si utilizza in genere una delle due strategie di routing seguenti: bubbling o tunneling. In questo esempio viene considerato l'evento bubbling e viene utilizzato l'evento ButtonBase.Click per illustrare il funzionamento del routing.

Nell'esempio riportato di seguito vengono creati due controlli Button e viene utilizzata la sintassi degli attributi XAML per associare un gestore eventi a un elemento padre comune, che in questo esempio è StackPanel. Anziché associare singoli gestori eventi per ogni elemento Button figlio, nell'esempio viene utilizzata la sintassi degli attributi per associare il gestore eventi all'elemento StackPanel padre. Con questo modello di gestione di eventi viene illustrato in che modo utilizzare il routing di eventi come tecnica per ridurre il numero di elementi a cui è associato un gestore. Tutti gli eventi bubbling per ogni Button sono indirizzati tramite l'elemento padre.

Si noti che nell'elemento StackPanel padre, il nome di evento Click specificato come attributo è parzialmente qualificato mediante la denominazione della classe Button. La classe Button è una classe derivata ButtonBase che dispone dell'evento Click nel proprio elenco dei membri. La tecnica della qualifica parziale per l'associazione di un gestore eventi è necessaria se l'evento che viene gestito non esiste nell'elenco dei membri dell'elemento a cui viene associato il gestore dell'evento indirizzato.

<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>

Nell'esempio riportato di seguito viene descritta la gestione dell'evento Click. Nell'esempio viene stabilito quale elemento gestisce l'evento e quale elemento genera l'evento. Il gestore eventi viene eseguito quando l'utente fa clic su uno dei pulsanti.

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

Vedere anche

Riferimenti

RoutedEvent

Concetti

Cenni preliminari sull’input

Cenni preliminari sugli eventi indirizzati

Descrizione dettagliata della sintassi XAML

Altre risorse

Procedure relative agli eventi

Cronologia delle modifiche

Data

Cronologia

Motivo

Luglio 2010

Aggiunto esempio per il gestore eventi.

Commenti e suggerimenti dei clienti.