RoutedEventのキャンセル
About
マウスの左クリックを通知するMouseLeftButtonDownや、スクロールを通知するMouseWheelイベントといったものがあります。これらはイベントのバブリング・トンネリングによってそのマウスが重なる全てのコントロールに順を追って通知されますが、開発するアプリケーションによってはその通知の途中で後続するコントロールへのイベントの通知を中止したい場合があるでしょう。ここではその方法について解説します。
厳密にはイベントの通知は続行されますが、処理済みとしてスキップされる、というのが正しい(よう)です。
HowTo
マウスイベントで通知される情報MouseEventArgsは、元をたどれば全てRoutedEventArgsを継承しています。またマウスイベントに限らず、多くのコントロールがRoutedEventArgsを継承したクラスによってイベント情報を通知します。このRoutedEventArgsに与えられたプロパティ、"Handled"を制御することによって、イベントの通知を後続のコントロールに続行したり、停止したりすることができます。
方法は至極簡単です。通知されたイベント情報からRoutedEventArgs.Handledプロパティを参照し、その値をtrueにすることによって、後続のコントロールでのイベントの通知を中止します。逆にfalseに設定すれば、イベントの通知は続行されます。そのため初期値はfalseです。
Sample
例えば特定のコントロールでスクロールに対する処理を実行した後、それより下に配置(校正)されているコントロールがスクロールすることなどを回避したい場合には次のように実装します。
protected override void OnMouseWheel(MouseWheelEventArgs e) { base.OnMouseWheel(e); //任意の処理 //後続するコントロールなどでスクロールを実行させない。 e.Handled = true; }
このような実装方法がアプリケーションの実装として正しい形式であるかどうかは不明です。期待する効果は得られますが。
例外やその他の情報
この方法によって特定のコントロールでのイベント処理をスキップする実装は、もしかしたら完全ではないかもしれません。イベントハンドラの実装方法によっては、スキップの対象外となるためです。詳細については公式を確認してください。