Share via


DirectManipulation で複数のビューポートを使用する

複数のビューポートを使用する場合、 ヒット テストでは、接触の画面位置を取得し、接触がヒットするビューポート四角形を決定することで、ユーザー入力の影響を受けるビューポートを決定します。

直接操作の一般的なシナリオは、あるビューポートを別のビューポート (ネスト ビューポートとも呼ばれます) 内に配置することです。 接触が複数のビューポートにヒットした場合、ウィンドウの WndProc による SetContact 呼び出しの順序によって、入れ子になったビューポートの親子関係が決まります。

ルール: 子要素は、親を呼び出す前に SetContactを呼び出す必要があります。

ヒット テストのヒエラシーを示す図

ビューポートに接触が停止します。 SetContact は、まずオレンジ色 (子) ビューポートで呼び出し、次に緑 (親) ビューポートで呼び出して正しい階層を確立する必要があります。

正しいビューポートをターゲットに設定する

接触は任意の数のビューポートに関連付けることができ、各接触は異なるビューポートセットに割り当てることができます。

各ビューポートは、必要に応じて特定の相互作用をサポートするように構成できます。

これらの設定に基づいて、 直接操作 によって、入力を処理するビューポートが識別されます。 ヒット テスト階層内の最も子のビューポートには、入力を処理する最初の機会があります。 ただし、チェーンと親の昇格の両方で、入力を処理するビューポートを変更できます。

チェーン

操作中にコンテンツの末尾に到達すると、 直接操作 は境界効果を適用して、コンテンツがそれ以上行かないことを示します。 ただし、子ビューポートが親ビューポート に連結されている 場合、この効果は抑制されます。 代わりに、操作をサポートするヒット テスト階層内の最も近い先祖ビューポートが入力を処理します。 操作の方向が逆になり、先祖がチェーンがトリガーされたポイントに戻る場合、操作は "アンチェーン" され、コントロールは子ビューポートに戻ります。

チェーン操作を示す図

ユーザーが子ビューポートをコンテンツの端までパンすると、操作は親ビューポートに "チェーン" され、代わりに親コンテンツのパンが開始されます。

Note

X 軸と Y 軸は互いに独立してチェーンされるため、対角パンが y 境界の前の x 境界にヒットした場合、操作は親を x 方向に移動し、子を y 方向に移動し続けます。 チェーンを有効または無効にするには、子ビューポートで SetChaining API を呼び出します。

レール

ビューポートの設定でレールを指定すると、入力がビューポートからチェーンされる方法に影響します。 具体的には、入力はレール付きの子ビューポートから、レールの "未レール" パン モードで親にチェーンすることはできません。 レールが設定されているときに入力をチェーンするには、ユーザーが垂直方向または水平方向にパンし、レールにロックされている必要があります。

ズーム

子ビューポートが親の内部に入れ子になっていて、両方がズーム用に構成されている場合、ズーム操作は子から親に連結できます。 ただし、操作が続行される場合は、親に対してのみ動作し、子に対して "アンチェーン" することはできません。 ユーザーが子から親にズームを連結した場合、 直接操作は、操作 に関連付けられているすべての連絡先が画面から削除されるまで、子を中断します。 この時点で、子は中断から解放され、ユーザーは子ビューポートをパンできます。

ジェスチャのターゲット設定: 親の昇格

ジェスチャ のターゲット 設定は、 直接操作 で連絡先をグループ化し、入力を処理するビューポートを決定するプロセスです。 親昇格 とは、入力が子から親に転送されるケースを指します。 たとえば、ユーザーがスクロール専用に構成された子ビューポート内で 2 つの接触とピンチを下に置くと、ズームが行われるように、入力が親に昇格されます。 親の昇格は、子ビューポートでチェーンが有効になっているかどうかに関係なく発生します。

チェーンとは異なり、親の昇格は逆になりません。 親ビューポートは、すべての接触が持ち上げられるまで相互作用入力を処理し続けます (子ビューポートは入力の処理を停止します)。