Compartilhar via


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.

Consulte também

Conceitos

Visão geral sobre eventos roteados

Input Overview

Visão geral sobre criação de controles