Top > Programming > .NetFramework > WPF > RoutedEventCancel
Last-modified: Sat, 13 Apr 2013 07:38:12 JST
Counter:3894 Today:1 Yesterday:3 Online:7
このエントリーをはてなブックマークに追加

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;
        }

このような実装方法がアプリケーションの実装として正しい形式であるかどうかは不明です。期待する効果は得られますが。

例外やその他の情報

この方法によって特定のコントロールでのイベント処理をスキップする実装は、もしかしたら完全ではないかもしれません。イベントハンドラの実装方法によっては、スキップの対象外となるためです。詳細については公式を確認してください。