Condividi tramite


Procedura: creare un evento indirizzato personalizzato

Affinché l'evento personalizzato supporti il routing degli eventi, è necessario registrare un oggetto RoutedEvent utilizzando il metodo RegisterRoutedEvent. In questo esempio vengono illustrate le nozioni di base per la creazione di un evento indirizzato personalizzato.

Esempio

Come mostrato nell'esempio seguente, è necessario innanzi tutto registrare un oggetto RoutedEvent utilizzando il metodo RegisterRoutedEvent. Per convenzione, il nome del campo statico RoutedEvent deve terminare con il suffisso Event In questo esempio, il nome dell'evento è Tap e la strategia di routing dell'evento è Bubble. Dopo la chiamata di registrazione, è possibile fornire funzioni di accesso di aggiunta e rimozione dell'evento common language runtime (CLR) per l'evento.

Si noti che anche se l'evento viene generato tramite il metodo virtuale OnTap in questo particolare esempio, la modalità di generazione dell'evento o la relativa risposta alle modifiche varierà in base alle esigenze.

In questo esempio inoltre viene implementata un'intera sottoclasse di Button; tale sottoclasse è compilata come assembly separato e ne viene quindi creata un'istanza come classe personalizzata in una pagina Extensible Application Markup Language (XAML) separata. Ciò vale a dimostrare che i controlli sottoclassati possono essere inseriti in strutture ad albero composte di altri controlli e che, in una situazione del genere, gli eventi personalizzati su questi controlli dispongono delle stesse funzionalità di routing di qualsiasi elemento Windows Presentation Foundation (WPF) nativo.

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>

Gli eventi di tunneling sono creati con la stessa modalità, ma impostando la proprietà RoutingStrategy su Tunnel nella chiamata di registrazione. Per convenzione, gli eventi di tunneling in WPF vengono denominati con il prefisso "Preview".

Per un esempio di funzionamento degli eventi di bubbling, vedere Procedura: gestire un evento indirizzato.

Vedere anche

Concetti

Cenni preliminari sugli eventi indirizzati

Cenni preliminari sull’input

Cenni preliminari sulla modifica di controlli