プレビュー イベントPreview Events

プレビュー イベント、トンネル イベントとも呼ばれますにはルーティング イベントがあるイベントを発生し、イベント データのソースとして報告された要素に対するアプリケーションのルートからルートの方向が送信されます。Preview events, also known as tunneling events, are routed events where the direction of the route travels from the application root towards the element that raised the event and is reported as the source in event data. すべてのイベント シナリオがサポートまたはプレビュー イベント; が必要です。このトピックでは、カスタム コンポーネントまたはクラスでプレビュー イベントを作成する可能性がありますが、適切なである場合、プレビュー イベントが存在、アプリケーションまたはコンポーネントを処理する方法、それらの状況について説明します。Not all event scenarios support or require preview events; this topic describes the situations where preview events exist, how applications or components should handle them, and cases where creating preview events in custom components or classes might be appropriate.

プレビュー イベントと入力Preview Events and Input

イベントは一般に、注意するプレビューを処理するときに、イベントをマークすることでイベント処理データ。When you handle Preview events in general, be cautious about marking the events handled in the event data. 以外の任意の要素でプレビュー イベントを処理すること (イベント データのソースとして報告される要素) を発生させた要素は、要素外の発生するイベントを処理する機会を提供しない効果があります。Handling a Preview event on any element other than the element that raised it (the element that is reported as the source in the event data) has the effect of not providing an element the opportunity to handle the event that it originated. 場合があります内でのコントロールの複合リレーションシップに問題の要素が存在しない場合に特に、目的の結果になります。Sometimes this is the desired result, particularly if the elements in question exist in relationships within the compositing of a control.

入力イベントを具体的には、プレビュー イベントを共有もイベント データ インスタンス、同等のバブル イベント。For input events specifically, Preview events also share event data instances with the equivalent bubbling event. プレビュー イベントのクラス ハンドラーを使用して、入力イベントを処理済みのマークする場合、バブル入力イベントのクラス ハンドラーは呼び出されません。If you use a Preview event class handler to mark the input event handled, the bubbling input event class handler will not be invoked. または、プレビュー イベントのインスタンス ハンドラーにイベントを処理済みのマークを使用する場合、バブル イベントのハンドラーは通常呼び出されません。Or, if you use a Preview event instance handler to mark the event handled, handlers for the bubbling event will not typically be invoked. クラス ハンドラーやインスタンス ハンドラーを登録またはアタッチする手法は通常使用されませんが、イベントが処理された、マークされている場合でも呼び出されるオプション。Class handlers or instance handlers can be registered or attached with an option to be invoked even if the event is marked handled, but that technique is not commonly used.

クラスの処理とプレビュー イベントに関連付ける方法の詳細については、次を参照してください。ルーティング イベントの処理済み、およびクラス処理としてのマーキングします。For more information about class handling and how it relates to Preview events see Marking Routed Events as Handled, and Class Handling.

コントロールによるイベント抑制の回避Working Around Event Suppression by Controls

プレビュー イベントが頻繁に使用されている 1 つのシナリオが、複合コントロールの入力イベントを処理します。One scenario where Preview events are commonly used is for composited control handling of input events. 場合によっては、コントロールの作成者より多くの情報をより具体的な動作を表すコンポーネント定義のイベントを置換するには、おそらくそのコントロールでは、送信元から特定のイベントを抑制します。Sometimes, the author of the control suppresses a certain event from originating from their control, perhaps in order to substitute a component-defined event that carries more information or implies a more specific behavior. たとえば、 Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Buttonを抑制しますMouseLeftButtonDownMouseRightButtonDownによって生成されるイベントのバブリング、Buttonまたはマウスをキャプチャして発生を優先してその複合要素をClickによって常に発生するイベントをButton自体。For instance, a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Button suppresses MouseLeftButtonDown and MouseRightButtonDown bubbling events raised by the Button or its composite elements in favor of capturing the mouse and raising a Click event that is always raised by the Button itself. イベントとそのデータ、ルートでは、引き続きだ、 Button 、イベント データをマークHandledで動作する必要がありますが、個別に指定したイベントのハンドラーにのみ、handledEventsTooケースが呼び出されます。The event and its data still continue along the route, but because the Button marks the event data as Handled, only handlers for the event that specifically indicated they should act in the handledEventsToo case are invoked. 代わりをコードでハンドラーをアタッチする場合は、アプリケーションのルートに近い方には、その他の要素もコントロールで抑制されたイベントを処理すること、handledEventsTooとして指定されたtrueします。If other elements towards the root of your application still wanted an opportunity to handle a control-suppressed event, one alternative is to attach handlers in code with handledEventsToo specified as true. プレビューと同等の入力イベントを処理するルーティングの方向を変更する単純な手法は、多くの場合。But often a simpler technique is to change the routing direction you handle to be the Preview equivalent of an input event. たとえば、コントロールを抑制する場合MouseLeftButtonDown、ハンドラーを添付するをお試しくださいPreviewMouseLeftButtonDown代わりにします。For instance, if a control suppresses MouseLeftButtonDown, try attaching a handler for PreviewMouseLeftButtonDown instead. この手法だけが、基本要素の入力イベントなどMouseLeftButtonDownします。This technique only works for base element input events such as MouseLeftButtonDown. これらの入力イベントは、トンネル/バブルのペアを使用して、両方のイベントを発生させるし、イベント データを共有します。These input events use tunnel/bubble pairs, raise both events, and share the event data.

これらの手法が、副作用または制限事項のいずれか。Each of these techniques has either side effects or limitations. プレビュー イベントの処理の副作用は、バブル イベントを処理するハンドラーが無効にイベントをその時点で処理をそのため、制限がある通常いない処理、Previ にまだ残っているイベントをマークすることをお勧め新しいルートの一部です。The side effect of handling the Preview event is that handling the event at that point might disable handlers that expect to handle the bubbling event, and therefore the limitation is that it is usually not a good idea to mark the event handled while it is still on the Preview part of the route. 制限、handledEventsToo手法は指定できません、handledEventsTooハンドラーXAMLXAMLを属性としてする必要がありますに登録するイベント ハンドラーのコード ハンドラーがアタッチされる要素へのオブジェクト参照を取得した後。The limitation of the handledEventsToo technique is that you cannot specify a handledEventsToo handler in XAMLXAML as an attribute, you must register the event handler in code after obtaining an object reference to the element where the handler is to be attached.

関連項目See also