6

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

如您所见,我有一个ScrollViewerwithin a PivotItem,而 inside 是 a Grid。在Grid大约有 20TextBox秒,每个在一个Border. 当此页面加载时,我将焦点动态设置为其中一个TextBox,因此无论何时我将焦点设置为TextBox#6-20(大致) - 我必须手动向下滚动才能看到它。我想自动滚动我的ScrollViewer,这样无论哪个TextBox有焦点,它都会居中供用户查看。

文档ScrollToVerticalOffset()说:

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

并且它接受一种System.Double.

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

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

提前谢谢了!

4

1 回答 1

12

您可以使用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);

祝你好运!

于 2013-02-27T16:07:23.333 回答