如何使用ScrollViewer.ScrollToVerticalOffset?

时间:2013-02-27 14:47:42

标签: silverlight windows-phone-8 windows-phone scrollviewer

我希望这不是重复,但我找不到任何关于如何使用 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>

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

ScrollToVerticalOffset()的{​​{3}}说:

  

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

它接受一种System.Double

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

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

非常感谢提前!

1 个答案:

答案 0 :(得分:11)

您可以使用 UIElement.TransformToVisual 调用查看任何UIElement相对于其他UIElement的位置。

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

GeneralTransform transform = textBox.TransformToVisual(scrollViewer);

然后,弄清楚TextBox的哪一点(0,0)相对于ScrollViewer。意思是,TextBox原点(0,0)位于ScrollViewer的位置。

Point textBoxPosition = transform.Transform(new Point(0, 0));

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

scrollViewer.ScrollToVerticalOffset(textBoxPosition.Y);
祝你好运!