画面上の中央の項目がビューポートの中央に配置されるように、ドラッグが終了した後に自動的に位置にスナップするスクロール サーフェス リストボックスを作成しようとしています。
中央のアイテムを取得しましたが、いつものように WPF がサイズ、画面位置、およびオフセットを処理する方法に困惑しています。
現時点では、SurfaceScrollViewer の ManipulationCompleted イベントをサブスクライブすることを選択しました。これは、スクロール ジェスチャを終了した後に一貫して発生するように見えるためです (一方、ScrollChanged イベントは早期に発生する傾向があります)。
void ManipCompleted(object sender, ManipulationCompletedEventArgs e)
{
FocusTaker.Focus(); //reset focus to a dummy element
List<FrameworkElement> visibleElements = new List<FrameworkElement>();
for (int i = 0; i < List.Items.Count; i++)
{
SurfaceListBoxItem item = List.ItemContainerGenerator.ContainerFromIndex(i) as SurfaceListBoxItem;
if (ViewportHelper.IsInViewport(item) && (List.Items[i] as string != "Dummy"))
{
FrameworkElement el = item as FrameworkElement;
visibleElements.Add(el);
}
}
int centerItemIdx = visibleElements.Count / 2;
FrameworkElement centerItem = visibleElements[centerItemIdx];
double center = ss.ViewportWidth / 2;
//ss is the SurfaceScrollViewer
Point itemPosition = centerItem.TransformToAncestor(ss).Transform(new Point(0, 0));
double desiredOffset = ss.HorizontalOffset + (center - itemPosition.X);
ss.ScrollToHorizontalOffset(desiredOffset);
centerItem.Focus(); //this also doesn't seem to work, but whatever.
}
リストはスナップしますが、スナップする場所はやや混沌としているようです。画面の中央に線があり、アイテムの真ん中に見えることもありますが、横にずれたり、アイテムの間にあることもあります。完全に突き止めることはできませんが、リストの 1 番目と 4 番目の四分位数はうまく機能しているように見えますが、2 番目と 3 番目の四分位数は徐々に中心に向かって外れています。
WPF でポジショニングを使用する方法についてのヘルプを探しています。パーセンテージベースの座標と「スクリーン単位」座標の相対性と違いのすべてが、この時点で多少混乱しています。