エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

UIElement.AddHandler メソッド

2013/12/12

指定したルーティング イベントのルーティング イベント ハンドラーを、現在の要素のハンドラー コレクションに追加します。イベント ルート上の他の要素により既に処理済みとしてマークされているルーティング イベントに対し、指定したハンドラーが呼び出されるようにするには、handledEventsTootrue に指定します。

Namespace:  System.Windows
アセンブリ:  System.Windows (System.Windows.dll 内)

public void AddHandler(
	RoutedEvent routedEvent,
	Delegate handler,
	bool handledEventsToo
)

パラメーター

routedEvent
型: System.Windows.RoutedEvent
処理するルーティング イベントの識別子。
handler
型: System.Delegate
ハンドラー実装への参照。
handledEventsToo
型: System.Boolean
イベント データ内でルーティング イベントが処理済みとしてマークされている場合に呼び出されるようにハンドラーを登録する場合は true。ルーティング イベントが既に処理済みとしてマークされている場合はハンドラーを呼び出さないという既定の条件を使用してハンドラーを登録する場合は false。既定値は false です。ルーティング イベントの再処理を日常的に要求しないでください。詳細については、「解説」を参照してください。

例外条件
ArgumentNullException

routedEvent または handlernull. です。

ArgumentException

routedEvent が、サポートされているルーティング イベントを表していません。

または

handler が、サポートされているデリゲートを実装していません。

NotImplementedException

現在のプラットフォーム バリエーションではサポートされていないイベントのハンドラーを追加しようとしました。

低レベル入力イベントを実際的な方法で処理することは複雑な作業です。多くのコントロールは、特定のイベントを処理済としてマークし、より直感的な別のイベントで置き換える動作を実装します。一般に、コントロールがルーティング イベントを処理済みとしてマークするのは、それを行う設計上の意図がある場合だけです。ただし、一部のシナリオでは、このような設計上の意図は特定の入力イベント処理の要求事項ではないことがあります。このようなシナリオでは、handledEventsTootrue に設定してハンドラーを登録することが適切です。ただし、この操作は日常的に行わないでください。処理済であるにもかかわらず、すべてのイベントに応答してハンドラーを呼び出すと、アプリケーションのイベント処理ロジックが複雑になります。ハンドラー ロジックが複雑になると、パフォーマンスが低下する可能性があります。処理済イベントにハンドラーをアタッチする必要があるのは、開発プロセス時に、アプリケーションおよびユーザー コード ロジックで処理する必要のあるイベントが一部のコントロールによって処理されていることが既にわかっている場合のみです。

イベントとコントロールの特定の組み合わせによるクラス処理動作を回避する別の手法は、そのコントロールをサブクラス化し、その On* クラス メソッドをオーバーライドすることです。これらのメソッドは、コントロールがイベントを処理済みとマークする際に使用される特定のコード パスです。ただし、これも複雑になる可能性があります。基本実装ではイベントが処理済みとマークされるため、場合によっては、基本実装を呼び出さずに特定のコントロールの処理実装を再生成する必要があります。

AddHandler を使用するには、ルーティング イベントで、イベント識別子であるパブリックな静的フィールドを公開する必要があります。これは、routedEvent パラメーターに対して必要となります。これは、これらのコア クラスの特定のイベントについてのみ当てはまります。

FrameworkElement.Loaded および AddHandler は使用しないでください。FrameworkElement.Loaded は、Windows Phone 実装の真のルーティング イベントではありません。MouseMoveは、イベント データに Handled を含まないため、AddHandler と共に使用することはできません。また、FrameworkElement.BindingValidationErrorAddHandler と共に使用できません。これは、イベント識別子がなく、イベントのコントロール処理もないためです。

同じイベントの同じハンドラーを、例外を発生させずに、複数回追加できます。ただし、イベントの処理中に、ハンドラーが実際に複数回呼び出されます。したがって、ハンドラー実装において、この動作がどのような副作用をもたらす可能性があるかを検討します。

次の例は、ルーティング イベント (KeyDown) のハンドラーの実装、および、その KeyDown ハンドラーを XAML で定義されたページのルート要素にアタッチする Loaded イベント ハンドラーを示しています。+= 構文を使用する代わりに、handledEventsTootrue として AddHandler を呼び出します。CapsLock キーが使用されると、TextBox などのコントロールに固有の KeyDown / OnKeyDown の処理が実装されていても、イベント ルーティングを経由してルート要素に報告されます。

    // Assumes the UI has a TextBox that can pop-up the keyboard defined as a child of LayoutRoot, and a 
    // TextBlock named textBlock1 that can display text onscreen.
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
            LayoutRoot.Loaded +=new RoutedEventHandler(Load_Main);
        }

        private void Load_Main(object sender, RoutedEventArgs e)
        {
            UIElement target = sender as UIElement;
            target.AddHandler(UIElement.KeyDownEvent, new KeyEventHandler(LayoutRoot_KeyDown), true);
        }

        private void LayoutRoot_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.PlatformKeyCode == 233)
            {
                textBlock1.Text = "Caps Lock!";
            }
        }
    }


Windows Phone OS

サポート: 8.0, 7.1, 7.0

表示:
© 2014 Microsoft