次の方法で共有


IScrollAnchorProvider インターフェイス

定義

スクロール アンカーをサポートするスクロール コントロールのコントラクトを指定します。

public interface class IScrollAnchorProvider
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.Guid(2287858719, 62016, 23419, 167, 3, 191, 175, 57, 198, 162, 205)]
struct IScrollAnchorProvider
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.Guid(2287858719, 62016, 23419, 167, 3, 191, 175, 57, 198, 162, 205)]
public interface IScrollAnchorProvider
Public Interface IScrollAnchorProvider
派生
属性

注釈

スクロール アンカー設定

スクロール アンカーは、スクロール コントロールがビューポートの位置を自動的に変更して、コンテンツが目に見えてジャンプしないようにする場合です。 ジャンプは、コンテンツのレイアウトの変更によって発生します。 スクロール アンカー プロバイダーは、コンテンツ内の アンカー要素 の位置の変化を観察した後、シフトを適用します。

登録された候補のセットから CurrentAnchor を選択する際に使用するポリシーを決定するには、スクロール コントロールを実装する必要があります。

想定されている動作

レイアウトの変更がアンカー要素のサイズ/位置に影響を与えると、ビューポートは自動的にシフトして、ビューポートに対するアンカー要素の前の位置を維持します。

スクロール アンカー (つまり、ビューポートの自動シフト) は常に適用されません。 これは、候補要素がツリーに追加またはツリーから削除された結果、またはサイズが変化した結果として発生する必要があります。 レイアウトパスをトリガーする可能性がありますが、必ずしも自動ビューポートシフトを引き起こすとは限らないその他の状況は次のとおりです。

Anchor 要素

実装するコントロールは、以前に登録された候補のセットから アンカー要素 を選択し、 CurrentAnchor として設定する必要があります。

Candidate Anchor 要素

候補アンカー要素のセットは、前に呼び出された状況の中で変更される可能性があります。 要素は、次の方法で潜在的なアンカー候補として登録されます。

  1. UIElement.CanBeScrollAnchor プロパティを true に設定するか、または
  2. RegisterAnchorCandidate メソッドを使用して、 要素をプログラムで登録します。

CanBeScrollAnchor プロパティはいつでも設定できます。 設定すると、フレームワークは RegisterAnchorCandidateUnregisterAnchorCandidate/ を暗黙的に呼び出しますが、その要素の先祖のチェーンにある最初の IScrollAnchorProvider でのみ呼び出します。

フレームワークは同様に、 CanBeScrollAnchortrue に設定された要素をライブ ビジュアル ツリーに追加または削除して、要素を登録/登録解除します。 しかし、もう一度、これは要素の先祖のチェーンにある最初の IScrollAnchorProvider でのみ行われます。

仮想化コントロールは、生成された子要素に CanBeScrollAnchor を 自動的に設定することを選択できます。

ScrollViewer: 例

ScrollViewer コントロールは、ArrangeOverride 中にスクロール アンカーを実行します。 ArrangeOverride の先頭に AnchorRequested イベントが発生します。これにより、アンカー要素を明示的に指定できます。 それ以外の場合は、ビューポートの相対 アンカー ポイント に最も近い候補をビューポートで選択し、その要素を CurrentAnchor として設定します。

アンカー ポイントは 、HorizontalAnchorRatio プロパティと VerticalAnchorRatio プロパティから取得されます。 比率が 0 (既定値) の場合、アンカー ポイントはビューポートの左上隅です (FlowDirection が LeftToRight であると仮定)。 比率が両方とも 0.5 に設定されている場合、アンカー ポイントはビューポートの中心になります。 同様に、比率が両方とも 1.0 の場合、アンカー ポイントはビューポートの右下隅になります。

特殊なケース: エッジでのアンカー

スクロール可能なコンテンツの先頭または末尾は、特殊なアンカー シナリオを表します。 たとえば、電子メール アプリケーションのユーザーが一覧をある程度上下にスクロールした場合の予想される動作を考えてみましょう。 新しいメッセージが到着すると、リストの上部 (ユーザーが現在表示しているコンテンツの範囲外) に挿入されます。 ユーザーが現在表示しているものは、リストの上部に新しいメッセージが到着したため、突然新しい位置にジャンプしないようにする必要があります。 ただし、現在のスクロール位置が上部にある場合は、既存のコンテンツが下にシフトして新しいメッセージのスペースを確保するように見えるはずです。

逆のシナリオは、チャット エクスペリエンスです。 ユーザーが一番下までスクロールされ、新しいメッセージが到着すると、新しいメッセージを表示するためのスペースを確保するために、コンテンツが上にシフトするように見えるはずです。 実際には、スクロール可能なコンテンツの新しい末尾を追跡するために、ビューポートを下にシフトする必要があります。 ユーザーがコンテンツの先頭/末尾までスクロールされない場合は、"興味深い" と見なされる一部の表示コンテンツに対するビューポートの位置は同期したままにする必要があります (つまり、アンカー)。

ScrollViewer では、 HorizontalAnchorRatio プロパティと VerticalAnchorRatio プロパティの値 0.0 と 1.0 特別な動作で処理されます。 両方の値が 0.0 で、ユーザーが開始位置までスクロールされた場合、開始位置はアンカー候補ではなくアンカーとして使用されます。 同様に、両方の値が 1.0 で、ユーザーが最後までスクロールされた場合、コンテンツの末尾がアンカーとして使用されます。 サイズの変更によって端の位置が大きくなる場合は、新しい端が使用されます。

プロパティ

CurrentAnchor

スクロール アンカーに使用する現在選択されているアンカー要素。

メソッド

RegisterAnchorCandidate(UIElement)

潜在的なスクロール アンカー候補として UIElement を登録します。

UnregisterAnchorCandidate(UIElement)

潜在的なスクロール アンカー候補として UIElement の登録を解除します。

適用対象

こちらもご覧ください