WPFのタッチサポート
この記事は、若干修正したタッチと操作 WPFタッチのサポートに関する自分のために簡単な概要とリファレンスとしては、MSDNの。
概要
Windows 7オペレーティングシステムに新しいハードウェアとAPIは、アプリケーションは同時に複数のタッチからの入力を受信する機能を提供しています。 WPFには、タッチが発生したときにイベントを発生させることにより、マウスやキーボードなど、他の入力に応答すると同様の方法で触れることを検出し、応答するアプリケーションを可能にします。
タッチイベントと操作イベント:WPFは、イベントの2種類のタッチが発生した公開されています。 タッチイベントは、各タッチスクリーン上で指とその動きについて生データを提供しています。 操作イベントは、特定のアクションとして入力を解釈します。
前提条件
あなたはタッチに反応するアプリケーションを開発するには、次のコンポーネントを必要としています。
- Microsoft Visual Studio 2010を。
- Windows 7の。
- Windowsタッチをサポートしているようなタッチスクリーンなどのデバイス、、。
タッチイベントと操作イベント:WPFは、イベントの2種類のタッチが発生した公開されています。 タッチイベントは、各タッチスクリーン上で指とその動きについて生データを提供しています。 操作イベントは、特定のアクションとして入力を解釈します。
用語
タッチが議論されている場合は、次の用語が使用されています。
- タッチはWindows 7で認識されるユーザー入力の種類です。 通常、タッチがタッチスクリーンに指を置くことによって開始されます。 デバイスは、単にマウス入力として、指の位置と動きに変換する場合、ラップトップコンピュータ上で一般的であるタッチパッドなどのデバイスは、タッチをサポートしていないことに注意してください。
- マルチタッチは、同時に複数のポイントから発生する感じです。 Windows 7とWPFには、マルチタッチをサポートしています。 タッチがWPFのドキュメントで説明されるたびに、その概念はマルチタッチにも適用されます。
- タッチがオブジェクトに適用される物理的なアクションとして解釈されている時は操作が発生します。 WPFでは、操作イベントは、変換、拡大、または回転操作として入力を解釈します。
- タッチデバイスは、タッチスクリーン上の単一の指など、タッチ入力を生成し、デバイスを表します。
タッチに応答するコントロール
次のコントロールは、それがビューの外にスクロールされたコンテンツを持っている場合、コントロール上で指をドラッグしてスクロールできます。
- コンボボックス(ComboBox)
- コンテキストメニュー
- DataGridの
- リストボックス(ListBox)
- ListViewコントロール
- MenuItemは
- テキストボックス(TextBox)
- ツールバー
- TreeViewコントロール
- ScrollViewerは定義されてScrollViewer.PanningModeあなたは水平、垂直、その両方、またはどちらでもない有効になっているタッチパンかどうかを指定することができます添付プロパティを。 ScrollViewer.PanningDecelerationのプロパティは、ユーザーがタッチスクリーンから指を離したときにスクロールが遅くなりますどのように迅速に指定します。 ScrollViewer.PanningRatio添付プロパティは、操作がオフセットに変換するスクロールオフセットの比率を指定します。
クラス図
クラス図の下に主要なクラスとタッチをサポートするためにそのメンバーを強調表示します。
- タッチ
- タッチイベントの両方で公開されているUIElementは 、 UIElement3D 、およびContentElementのバブルイベントとして、と経由してタッチ 。 FrameReportedアプリケーションレベルのイベント(シルバーとの互換性を保つため)など。
- タッチダウンしながら、上に移動してイベントがトンネリングおよびバブリング両方とも入力して、イベントだけでバブリングされたまま触れないでください。
- タッチデバイスのキャプチャが経由して明示的であるUIElementの 。 CaptureTouchの方法。
- タッチイベントが同期しています。
- タッチイベントは、常に操作イベントが発生しているかどうか、解雇されています。
- WPFでは、マルチタッチをサポートしています。
- 操作
- 操作イベントはによって公開されているUIElementのイベントのみをバブリングとして。
- 操作イベントはで発射されたUIElementのみIsManipulationEnabledは trueです。
- 操作イベントは、同期しています。
- 拡大と回転(ピボットポイントを持つ単一の指の回転を含む)、および慣性:WPFは、操作の3つのタイプがサポートされています。
- タッチデバイスのキャプチャは、操作と暗黙的です。
- 静的クラスの操作は、操作のイベントハンドラの外で操作パラメータを取得および更新するメソッドが含まれています。 また、このようなマニピュレータの追加と削除を追加するなどの操作ロジック、より高度な使用のためのメソッドが含まれています。
- WPFは、複数のジェスチャーをサポートしています。
- WPFには、ジェスチャー、または3Dの操作をサポートしていません。
- ScrollViewerは操作と慣性のサポートを内蔵しており、それはアプリケーションによってカスタマイズ可能です。
タッチ
タッチイベント
基底クラス、 UIElementは 、 UIElement3D 、およびContentElementは 、あなたのアプリケーションは、タッチに反応されるようにサブスクライブすることができるイベントを定義します。 アプリケーションがオブジェクトを操作する以外のものとしてタッチを解釈するときにタッチイベントに便利です。 たとえば、ユーザーが1つまたは複数の指で描くことができるようにするアプリケーションは、タッチイベントにサブスクライブします。
すべての3つのクラスにかかわらず、定義するクラスの同様の動作は、次のイベントを定義します。
- タッチダウン
- TouchMove
- TouchUpの
- TouchEnter
- TouchLeave
- PreviewTouchDown
- PreviewTouchMove
- PreviewTouchUp
- GotTouchCapture
- LostTouchCapture
キーボードイベントとマウスイベントと同様に、タッチイベントはルーティングイベントです。 プレビューで始まるイベントはトンネルイベントとイベントをバブリングされているタッチで始まるイベントです。 あなたはこれらのイベントを処理するときには、呼び出すことによって、任意の要素に対する入力の位置を取得することができますGetTouchPointまたはGetIntermediateTouchPointsの方法。
タッチイベントの実行パス
タッチイベント間の相互作用を理解するために、ユーザーが要素上の1つの指を置くシナリオを考慮し、要素内で指を移動し、その要素から指を離す。 次の図は、バブルイベントの実行を(トンネリングイベントは簡単にするために省略されている)を示しています。
次のリストは、前の図のイベントのシーケンスを説明しています。 
TouchEnterのイベントは、ユーザーが要素上に指を置く1回発生します。
タッチダウンイベントが1回発生します。
TouchMoveユーザーが要素内に指を移動するとイベントが複数回発生します。
TouchUpのイベントは、ユーザーが要素から指を離す1回発生します。
TouchLeaveのイベントが1回発生します。
本以上の指が使用されている場合、イベントは各指のために発生します。
操作と慣性
操作イベント
アプリケーションは、ユーザーがオブジェクトを操作することができますケースでは、 UIElementのクラスは操作イベントを定義します。 単にタッチの位置を報告し、タッチイベントとは異なり、操作イベントが入力を解釈する方法を報告します。 操作、変換、拡大、回転の3つのタイプがあります。 次のリストは、操作の3種類の起動方法について説明します。
オブジェクト上に指を置き、翻訳操作を呼び出すためにタッチスクリーン上で指を移動します。 これは通常、オブジェクトを移動します。
オブジェクト上の2つの指を入れ、拡張操作を呼び出すためにお互いに近づい一緒に、または離れて指を動かす。 これは通常、オブジェクトのサイズを変更します。
オブジェクト上の2つの指を入れ、回転操作を呼び出すためにお互いの周りを指で回転させます。 これは通常、オブジェクトを回転させます。
操作には複数のタイプが同時に発生する可能性があります。
あなたは、オブジェクトが操作に応答するために発生したときに、オブジェクトは慣性を持っているように見えることができます。 これは、あなたのオブジェクトは物理的な世界をシミュレートすることができます。 あなたは十分に懸命にプッシュする場合、たとえば、テーブルをはさんで本を押すと、この本は、あなたがそれを解放した後に移動していきます。 WPFは、ユーザの指がオブジェクトを解放した後に操作イベントを発生させることにより、この動作をシミュレートすることができます。
は、ユーザーが移動できるようにするアプリケーションを作成、サイズ変更、およびオブジェクトを回転させる方法については、以下を参照してくださいチュートリアル:初めてのタッチアプリケーションを作成する 。
UIElementは、以下の操作イベントを定義します。
デフォルトでは、 UIElementは、これらの操作イベントを受信しません。 上の操作イベントを受信するにはUIElementは 、セットがUIElement.IsManipulationEnabled trueに。
操作イベントの実行パス
ユーザーがオブジェクトを "スロー"のシナリオを考えます。 ユーザーがオブジェクト上に指を置き、短い距離のためにタッチスクリーン上で指を移動し、それが動いているしている間に指を離す。 この結果、オブジェクトは、ユーザーの指の下に移動すると、ユーザーが指を離した後、移動し続けることです。
次の図は、操作イベントと各イベントに関する重要な情報の実行パスを示しています。
操作イベント

次のリストは、前の図のイベントのシーケンスを説明しています。
ManipulationStartingユーザーがオブジェクト上に指を置くとイベントが発生します。 とりわけ、このイベントは、設定することができますManipulationContainerのプロパティを。 その後のイベントでは、操作の位置は相対的になりますManipulationContainer 。 以外のイベントではManipulationStarting 、このプロパティは読み取り専用なので、 ManipulationStartingイベントでは、このプロパティを設定することができる唯一の時間です。
ManipulationStartedイベントは、次のが発生します。 このイベントは、操作の起点を報告します。
のManipulationDeltaユーザーの指がタッチスクリーン上で移動するとイベントが複数回発生します。 DeltaManipulationののプロパティManipulationDeltaEventArgsのクラスは、操作が移動、拡大、または翻訳と解釈されているかどうかを報告します。 あなたがオブジェクトを操作するほとんどの作業を行う場所です。
はManipulationInertiaStartingユーザーの指が物体との接触を失ったときにイベントが発生します。 このイベントは、慣性時に操作の減速を指定することができます。 これはあなたが選択した場合、そのオブジェクトが別の物理的なスペースまたは属性をエミュレートすることができます。 たとえば、アプリケーションが物理的な世界の項目を表す2つのオブジェクトがあり、一方が他方よりも重いと仮定します。 あなたは、軽い物体よりも速く減速重いオブジェクトを作ることができます。
のManipulationDelta慣性が発生するとイベントが複数回発生します。 ユーザーの指がタッチスクリーンを越えて移動すると、WPFが慣性をシミュレートするときは、このイベントが発生することに注意してください。 言い換えれば、 のManipulationDeltaは、前と後の発生はManipulationInertiaStartingイベント。 ManipulationDeltaEventArgs.IsInertial財産報告するかどうかのManipulationDeltaイベントが慣性中に発生したので、そのプロパティをチェックし、その値に応じて異なるアクションを実行することができます。
ManipulationCompleted操作と、任意の慣性が終了したときにイベントが発生します。 結局のところ、つまりのManipulationDeltaイベントが発生し、 ManipulationCompletedイベントは、操作が完了したことを通知するために発生します。
境界フィードバック
UIElementは、また定義されてManipulationBoundaryFeedbackイベント。 ときにこのイベントが発生しReportBoundaryFeedbackメソッドがで呼び出されるのManipulationDeltaイベント。 ManipulationBoundaryFeedbackイベントは、オブジェクトが境界に当たったときに視覚的なフィードバックを提供するアプリケーションまたはコンポーネントを有効にします。 たとえば、 ウィンドウクラスは、ハンドルManipulationBoundaryFeedback 、そのエッジが検出されたときにわずかに移動するウィンドウを引き起こすイベントを。
マウスプロモーション
あなたを呼び出すことによって操作を取り消すことができます[キャンセル]を除くすべての操作イベントでイベント引数のメソッドをManipulationBoundaryFeedbackイベント。 お電話の際はキャンセル 、操作イベントはもはや発生しませんし、マウスイベントは、タッチのために発生します。 次の表は、操作がキャンセルされた時間と発生するマウスイベントの関係について説明します。
キャンセルがで呼び出されたイベント | 既に発生した入力に対して発生するマウスイベント |
|---|---|
イベントマウスダウン。 | |
マウスダウンとマウスムーブイベント。 | |
マウスダウン、マウス移動、マウスアップイベント。 |
あなたが呼び出す場合に注意してくださいキャンセル操作が慣性である場合、このメソッドはfalseを返し、入力がマウスイベントを発生させません。
タッチと操作イベントの関係
UIElementは、常にタッチイベントを受け取ることができます。 時IsManipulationEnabledプロパティがtrueに設定されている場合は、 UIElementは、タッチと操作イベントの両方を受け取ることができます。 場合タッチダウンイベントが処理されない(つまり、 Handledのプロパティがfalse)、操作ロジックは、要素にタッチをキャプチャし、操作イベントを生成します。 場合のHandledプロパティがtrueに設定されているタッチダウンイベント、操作ロジックでは操作イベントを生成しません。 次の図は、タッチイベントと操作イベントの関係を示しています。
タッチと操作イベント

次のリストは、前の図に示されているタッチと操作イベントの関係について説明します。
最初のタッチデバイスが生成するときにタッチダウン上のイベントをUIElementの 、操作ロジックを呼び出しCaptureTouchを生成するメソッド、 GotTouchCaptureのイベントを。
時GotTouchCaptureが発生すると、操作ロジックを呼び出しManipulation.AddManipulatorを生成するメソッド、 ManipulationStartingイベントを。
時TouchMoveイベントが発生し、操作ロジックが生成されますのManipulationDelta前に発生するイベントはManipulationInertiaStartingイベント。
要素の最後のタッチデバイスが発生したときに、 TouchUpのイベントを、操作ロジックが生成されはManipulationInertiaStartingイベント。
EventArgsクラスダイアグラム
クラス図の下にあるすべてのタッチと操作しているEventArgsクラスと、関連するタイプを示しています。








最近のコメント