Поделиться через


Как создать настраиваемое маршрутизируемое событие

Чтобы пользовательское событие поддерживало маршрутизацию событий, необходимо зарегистрировать 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 префиксируются словом "Предварительная версия".

Пример работы всплывающих событий, см. в разделе Обработка перенаправленного события.

См. также