Cómo: Crear un evento enrutado personalizado
Actualización: noviembre 2007
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 Lenguaje de marcado de aplicaciones extensible (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
<Window
xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
xmlns:custom="clr-namespace:SDKSampleLibrary;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 túnel se crean la misma manera, pero con la propiedad RoutingStrategy establecida en Tunnel en la llamada de registro. Por convención, los eventos de túnel de WPF llevan el prefijo "Preview".
Para consultar el ejemplo completo, que incluye la implementación del controlador de eventos "Tap" real, vea Ejemplo Custom Routed Events. 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