プレビュー イベント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.

クラスの処理とプレビュー イベントに関連する方法の詳細については、次を参照してください。 Handled、クラス処理とルーティング イベントをマークです。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抑制MouseLeftButtonDownMouseLeftButtonDownによって生成されるバブルのイベント、Buttonまたはその複合要素にマウスをキャプチャして、発生を優先するため、Clickによって常に発生するイベントをButton自体です。For instance, a Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) Button suppresses MouseLeftButtonDown and MouseLeftButtonDown 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. 1 つの代替手段がコードでのハンドラーをアタッチするには、アプリケーションのルートに近い方には、その他の要素も必要がある場合、コントロールで抑制されたイベントを処理する、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

ルーティング イベントの処理済みとしてのマーキング、およびクラス処理Marking Routed Events as Handled, and Class Handling
ルーティング イベントの概要Routed Events Overview