web-dev-qa-db-ja.com

UWPの要素までスクロールする方法

スクロールビューア内の特定の位置にスクロールするにはどうすればよいですか?

 <ScrollViewer x:Name ="MyScrollView" HorizontalScrollBarVisibility="Hidden" Height="500">                      
   <StackPanel x:Name="ContentsPanel">
        <TextBlock x:Name="someTb" Height="50">
        </TextBlock>
        <TextBlock x:Name="otherTb" Height="100">
        </TextBlock>
   </StackPanel>
</ScrollViewer>

Scrollviewerで特定の要素にスクロールしようとしていますが、UWPを初めて使用するため、その方法を正しく理解できません。

イベントが発生したときの2番目のテキストブロックでMyScrollViewのスクロール位置を設定したいと思います。

12
Nejdi Kroi

より良い解決策は、ChangeView/ScrollToVerticalOffsetの代わりにScrollToHorizontalOffsetを使用することです。後者は、Windows10では廃止されているためです。

MyScrollView.ChangeView(null, abosulatePosition.Y, null, true);

最後のパラメータをfalseに設定することで、アニメーションをスクロールすることもできますenable


更新

完成させるために、このための拡張メソッドを作成しました。

public static void ScrollToElement(this ScrollViewer scrollViewer, UIElement element, 
    bool isVerticalScrolling = true, bool smoothScrolling = true, float? zoomFactor = null)
{
    var transform = element.TransformToVisual((UIElement)scrollViewer.Content);
    var position = transform.TransformPoint(new Point(0, 0));

    if (isVerticalScrolling)
    {
        scrollViewer.ChangeView(null, position.Y, zoomFactor, !smoothScrolling);
    }
    else
    {
        scrollViewer.ChangeView(position.X, null, zoomFactor, !smoothScrolling);
    }
}

したがって、この場合は、電話する必要があります

this.MyScrollView.ScrollToElement(otherTb);
24
Justin XL

私は答えを見つけました

    var transform = otherTb.TransformToVisual(ContentsPanel);
    Point absolutePosition = transform.TransformPoint(new Point(0,0));
    MyScrollView.ScrollToVerticalOffset(absolutePosition.Y);

更新

UWPではScrollToVerticalOffsetは廃止されたため、

    MyScrollView.ChangeView(null,absolutePosition.Y,null,true)

代わりに使用する必要があります。 https://msdn.Microsoft.com/en-us/library/windows/apps/dn252763.aspx

6
Nejdi Kroi