Cómo: Crear un evento enrutado personalizado

Para que un evento personalizado admita el enrutamiento de eventos, es preciso registrar un RoutedEvent mediante el método RegisterRoutedEvent. En este ejemplo se muestran los fundamentos para la creación de evento enrutado personalizado.

Ejemplo

Como se muestra en el ejemplo siguiente, primero se registra RoutedEvent mediante el método RegisterRoutedEvent. Por convención, el nombre del campo estático RoutedEvent debe finalizar con el sufijo Event. En este ejemplo, el nombre del evento es Tap y la estrategia de enrutamiento del evento es Bubble. Después de la llamada de registro, puede proporcionar descriptores de acceso common language runtime (CLR) de agregar y quitar al evento.

Tenga en cuenta que aunque el evento se provoca a través del método virtual OnTap en este ejemplo concreto, la manera de provocar un evento o cómo responda este a los cambios dependerá de sus necesidades.

Observe también que en este ejemplo se implementa básicamente una subclase completa de Button; esa subclase se genera como un ensamblado independiente y, a continuación, se crea una instancia como una clase personalizada en una página Extensible Application Markup Language (XAML) independiente. El motivo de ello es ilustrar el concepto de que los controles con subclases pueden insertarse en árboles compuestos de otros controles y que, en esta situación, los eventos personalizados de estos controles tienen exactamente las mismas funciones de enrutamiento de eventos que cualquier elemento nativo de Windows Presentation Foundation (WPF).

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>

Los eventos de tunelización se crean la misma manera, pero con la propiedad RoutingStrategy establecida en Tunnel en la llamada de registro. Por convención, los eventos de tunelización de WPF llevan el prefijo "Preview".

Para obtener un ejemplo de funcionamiento de los eventos de propagación, vea Cómo: Controlar un evento enrutado.

Vea también

Conceptos

Información general sobre eventos enrutados

Información general sobre acciones del usuario

Información general sobre la creación de controles