方法: カスタム ルーティング イベントを作成するHow to: Create a Custom Routed Event

カスタム イベントでイベント ルーティングをサポートするには、RegisterRoutedEvent メソッドを使用して RoutedEvent を登録する必要があります。For your custom event to support event routing, you need to register a RoutedEvent using the RegisterRoutedEvent method. この例では、カスタム ルーティング イベント作成の基本を紹介します。This example demonstrates the basics of creating a custom routed event.

Example

次の例に示すように、最初に、RegisterRoutedEvent メソッドを使用して RoutedEvent を登録します。As shown in the following example, you first register a RoutedEvent using the RegisterRoutedEvent method. RoutedEvent 静的フィールドの名前は、Event という接尾辞で終わる決まりになっています。By convention, the RoutedEvent static field name should end with the suffix Event. この例では、イベントの名前は Tap です。イベントのルーティング方法は Bubble です。In this example, the name of the event is Tap and the routing strategy of the event is Bubble. 登録呼び出し後、イベントの add-and-remove 共通言語ランタイム (CLR) イベント アクセサーを指定できます。After the registration call, you can provide add-and-remove common language runtime (CLR) event accessors for the event.

この特別な例では OnTap 仮想メソッド経由でイベントが発生していますが、イベントの発生や変更に対するイベントの反応の仕方はニーズによって変わります。Note that even though the event is raised through the OnTap virtual method in this particular example, how you raise your event or how your event responds to changes depends on your needs.

また、この例では、基本的に Button のサブクラス全体を実装しています。このサブクラスは別個のアセンブリとして構築され、別個の Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) ページでカスタム クラスとしてインスタンス化されます。Note also that this example basically implements an entire subclass of Button; that subclass is built as a separate assembly and then instantiated as a custom class on a separate Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) page. これはサブクラス化されたコントロールを他のコントロールで構成されたツリーに挿入できるという概念を示すものです。この状況では、このようなコントロールのカスタム イベントには、あらゆるネイティブ Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) 要素とまったく同じイベント ルーティング機能が与えられます。This is to illustrate the concept that subclassed controls can be inserted into trees composed of other controls, and that in this situation, custom events on these controls have the very same event routing capabilities as any native Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) element does.

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 に設定されます。Tunneling events are created the same way, but with RoutingStrategy set to Tunnel in the registration call. WPFWPF のトンネル イベントには接頭辞として "Preview" という単語が付く決まりになっています。By convention, tunneling events in WPFWPF are prefixed with the word "Preview".

バブリング イベントの動作例については、「ルーティング イベントを処理する」を参照してください。To see an example of how bubbling events work, see Handle a Routed Event.

関連項目See also