我希望这不是重复,但我找不到任何关于如何使用 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
内的内容是否重要,但如果确实如此,我想要准确显示我是如何使用它的。
非常感谢提前!
答案 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);
祝你好运!