Como: Criar um evento roteado personalizado
Para que seu evento personalizado ofereça suporte a roteamento de eventos, você precisa registrar um RoutedEvent usando o método RegisterRoutedEvent. Este exemplo demonstra as noções básicas de criar um evento roteado personalizado.
Exemplo
Como mostrado no exemplo a seguir, você primeiro registra um RoutedEvent usando o método RegisterRoutedEvent. Por convenção, o nome do campo estático RoutedEvent deve terminar com o sufixo Event. Nesse exemplo, o nome do evento é Tap e a estratégia de roteamento do evento é Bubble. Após a chamada em que o registro é efetuado, você pode fornecer acessadores para inserção e remoção de eventos common language runtime (CLR) para o evento.
Observe que embora o evento seja gerado através do método virtual OnTap nesse exemplo específico, a maneira como você gera seu evento ou como seu evento responde a alterações depende de suas necessidades.
Observe também que esse exemplo basicamente implementa uma subclasse inteira de Button; essa subclasse é criada como um assembly separado e, em seguida, instanciada como uma classe personalizada em uma página Extensible Application Markup Language (XAML) separada. Isso é para ilustrar o conceito que controles representados por subclasses pode ser inseridos em árvores compostas de outros controles, e que nessa situação, eventos personalizados nesses controles possuem exatamente as mesmas capacidades de roteamento de eventos que um elemento nativo 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>
Eventos tunelantes são criados da mesma maneira, mas com RoutingStrategy definida como Tunnel na chamada em que se efetua o registro. Por convenção, eventos tunelantes em WPF são prefixados com a palavra "Preview".
Para ver o exemplo completo, incluindo a implementação do verdadeiro tratador de eventos "Tap", consulte Personalizar roteada exemplo de eventos. Para ver um exemplo de como eventos bolheados funcionam, consulte Como: Handle a Routed Event.