Практическое руководство. Создание пользовательских перенаправленных событий

Чтобы пользовательское событие поддерживало маршрутизацию событий, необходимо зарегистрировать событие RoutedEvent, используя метод RegisterRoutedEvent. В этом примере демонстрируются основные принципы создания пользовательских перенаправленных событий.

Пример

Как показано в следующем примере, сначала выполняется регистрация RoutedEvent с помощью метода RegisterRoutedEvent. По соглашению имя статического поля RoutedEvent должно заканчиваться суффиксом Event. В этом примере имя события — Tap, а стратегия маршрутизации этого события — Bubble. После вызова регистрации можно предоставить для этого события методы доступа к событию добавления и удаления среды CLR.

Обратите внимание, что несмотря на то что в этом примере событие вызывается виртуальным методом OnTap, метод вызова события и его реагирование на изменения зависят от ваших потребностей.

Обратите внимание, что этот пример в основном реализует весь подкласс Button; этот подкласс создается как отдельная сборка, а затем создается в качестве пользовательского класса на отдельной странице XAML. Это иллюстрирует концепцию, которую подклассированные элементы управления можно вставить в деревья, состоящие из других элементов управления, и что в этой ситуации пользовательские события этих элементов имеют те же возможности маршрутизации событий, что и любой собственный элемент WPF.

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();
    }
}
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="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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>

События нисходящей маршрутизации создаются аналогичным способом, однако в вызове регистрации для RoutingStrategy задано значение Tunnel. По соглашению события нисходящей маршрутизации в WPF имеют префикс Preview.

Пример функционирования восходящей маршрутизации событий см. в разделе Обработка перенаправленных событий.

См. также