次の方法で共有


方法: ルーティング イベントのクラス処理を追加する

ルーティング イベントは、ルート内の任意のノード上のクラス ハンドラーまたはインスタンス ハンドラーによって処理できます。 クラス ハンドラーは最初に呼び出され、クラス実装で使用して、インスタンス処理からのイベントを抑制したり、基底クラスが所有するイベントに対して他のイベント固有の動作を導入したりできます。 この例では、クラス ハンドラーを実装するための 2 つの密接に関連する手法を示します。

この例では、Canvas パネルに基づいてカスタム クラスを使用します。 アプリケーションの基本的な前提は、カスタム クラスでは、子要素クラスまたはその上のインスタンス ハンドラーが呼び出される前に、マウスの左ボタンクリックをインターセプトし、処理されたマークを付けるなど、子要素に対する動作を導入することです。

UIElement クラスは、イベントをオーバーライドするだけで、PreviewMouseLeftButtonDown イベントのクラス処理を可能にする仮想メソッドを公開します。 これは、このような仮想メソッドがクラスの階層内のどこかで使用できる場合に、クラス処理を実装する最も簡単な方法です。 次のコードは、OnPreviewMouseLeftButtonDownから派生した "MyEditContainer" の Canvas 実装を示しています。 この実装では、イベントが引数で処理されたとしてマークされ、ソース要素に基本的な目に見える変更を与えるコードがいくつか追加されます。

protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
    e.Handled = true; //suppress the click event and other leftmousebuttondown responders
    MyEditContainer ec = (MyEditContainer)e.Source;
    if (ec.EditState)
    { ec.EditState = false; }
    else
    { ec.EditState = true; }
    base.OnPreviewMouseRightButtonDown(e);
}
Protected Overrides Sub OnPreviewMouseRightButtonDown(ByVal e As System.Windows.Input.MouseButtonEventArgs)
    e.Handled = True 'suppress the click event and other leftmousebuttondown responders
    Dim ec As MyEditContainer = CType(e.Source, MyEditContainer)
    If ec.EditState Then
        ec.EditState = False
    Else
        ec.EditState = True
    End If
    MyBase.OnPreviewMouseRightButtonDown(e)
End Sub

基底クラスまたはその特定のメソッドに対して仮想が使用できない場合は、EventManager クラスのユーティリティ メソッドを使用してクラス処理を直接追加 RegisterClassHandler。 このメソッドは、クラス処理を追加するクラスの静的初期化内でのみ呼び出す必要があります。 この例では、PreviewMouseLeftButtonDown 用の別のハンドラーを追加します。この場合、登録されたクラスはカスタム クラスです。 これに対し、仮想を使用する場合、登録されたクラスは実際には UIElement 基底クラスです。 基底クラスとサブクラスが各レジスタ クラス処理の場合、サブクラス ハンドラーが最初に呼び出されます。 アプリケーションでの動作は、最初にこのハンドラーがそのメッセージ ボックスを表示し、次に仮想メソッドのハンドラーの視覚的な変更が表示されることです。

static MyEditContainer()
{
  EventManager.RegisterClassHandler(typeof(MyEditContainer), PreviewMouseRightButtonDownEvent, new RoutedEventHandler(LocalOnMouseRightButtonDown));
}
internal static void LocalOnMouseRightButtonDown(object sender, RoutedEventArgs e)
{
  MessageBox.Show("this is invoked before the On* class handler on UIElement");
  //e.Handled = true; //uncommenting this would cause ONLY the subclass' class handler to respond
}
Shared Sub New()
    EventManager.RegisterClassHandler(GetType(MyEditContainer), PreviewMouseRightButtonDownEvent, New RoutedEventHandler(AddressOf LocalOnMouseRightButtonDown))
End Sub
Friend Shared Sub LocalOnMouseRightButtonDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    MessageBox.Show("this is invoked before the On* class handler on UIElement")
    'e.Handled = True //uncommenting this would cause ONLY the subclass' class handler to respond
End Sub

こちらも参照ください