如何使用ScrollViewer.ScrollToVerticalOffset?

lha*_*han 5 silverlight scrollviewer windows-phone windows-phone-8

我希望这不是重复,但我找不到任何关于如何实际使用的 文档或示例ScrollToVerticalOffset().我在Windows Phone 8应用程序中使用它,但我认为它仍然适用于WP7和Silverlight(尽管如果我错了,请随时纠正我).

所以这是我的基本设置(来自内存的伪代码):

<phone.PivotItem>
   <ScrollViewer>
      <Grid Height="1500">
         <Grid.RowDefinitions>
            <!-- about 20 rows, all auto-height -->
         </Grid.RowDefinitions>

         <Border Grid.Row="0">
            <TextBox x:Name="txt1" />
         </Border>
         <Border Grid.Row="1">
            <TextBox x:Name="txt2" />
         </Border>

         <!-- ...... -->

         <Border Grid.Row="19">
            <TextBox x:Name="txt20" />
         </Border>
      </Grid>
   </ScrollViewer>
</phone.PivotItem>
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,我有一个ScrollViewer内部PivotItem,内部是一个Grid.在Grid大约20 TextBox秒,每个在一个Border.TextBox当这个页面加载时,我动态地将焦点设置为其中一个,所以任何时候我将焦点设置为TextBox#6-20(粗略) - 我必须手动向下滚动才能看到它.我想自动滚动我,ScrollViewer以便无论哪个TextBox有焦点,它都会居中以供用户查看.

文档ScrollToVerticalOffset()说:

将ScrollViewer中的内容滚动到指定的垂直偏移位置.

并且它接受一种类型System.Double.

我不明白的是A)我应该通过的价值,以及B)我怎么能得到那个价值?它应该是介于0和我的高度Grid(1500)之间的数字吗?如果是这样,我怎么能确定任何给定的位置,TextBox以便我可以滚动到它?

如果有任何简单的例子,请随时链接到他们.ScrollViewer在调用此方法时,我不确定问题中的内容是否存在,但如果确实如此,我想要准确显示我是如何使用它的.

提前谢谢了!

Gar*_*son 11

您可以使用UIElement.TransformToVisual调用查看任何UIElement相对于另一个UIElement的位置.

首先,获取TextBox和ScrollViewer之间的转换.

GeneralTransform transform = textBox.TransformToVisual(scrollViewer);
Run Code Online (Sandbox Code Playgroud)

然后,找出TextBox相对于ScrollViewer的哪个点(0,0).意思是,TextBox原点(0,0)位于ScrollViewer的位置.

Point textBoxPosition = transform.Transform(new Point(0, 0));
Run Code Online (Sandbox Code Playgroud)

现在您已知道TextBox相对于ScrollViewer的Y位置,滚动到该Y偏移.

scrollViewer.ScrollToVerticalOffset(textBoxPosition.Y);
Run Code Online (Sandbox Code Playgroud)

祝好运!