silverlight windows-phone-8 windows-phone scrollviewer

silverlight - ¿Cómo usar ScrollViewer.ScrollToVerticalOffset?



windows-phone-8 windows-phone (1)

Espero que esto no sea un duplicado, pero no puedo encontrar ninguna documentación o ejemplos sobre cómo usar ScrollToVerticalOffset() . Lo estoy usando en una aplicación de Windows Phone 8, pero creo que todavía se aplicará a WP7 y Silverlight (aunque, no dude en corregirme si me equivoco).

Así que aquí está mi configuración básica (pseudo-código de la memoria):

<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>

Como puede ver, tengo un ScrollViewer dentro de un PivotItem , y adentro hay una Grid . En la Grid hay aproximadamente 20 TextBox s, cada uno dentro de un Border . Estoy enfocando dinámicamente uno de estos TextBox de TextBox cuando se carga esta página, así que cada vez que configuro el foco en TextBox # 6-20 (más o menos) - tengo que desplazarme manualmente hacia abajo para verlo. Quiero desplazar automáticamente mi ScrollViewer para que cualquier TextBox tenga foco, se centrará para que el usuario lo vea.

La documentación para ScrollToVerticalOffset() dice:

Desplaza el contenido que está dentro del ScrollViewer a la posición de desplazamiento vertical especificada.

Y que acepta un tipo de sistema. System.Double .

Lo que no entiendo es A) el valor que se supone que debo aprobar, y B) ¿cómo podría obtener ese valor? ¿Se supone que es un número entre 0 y la altura de mi Grid (1500)? Si es así, ¿cómo podría determinar la posición de cualquier TextBox dado para poder desplazarme hacia él?

Si hay ejemplos claros, siéntete libre de vincularlos. No estoy seguro de si el contenido dentro de ScrollViewer importa cuando llamo a este método, pero en caso de que lo haga, quería mostrar exactamente cómo lo estoy usando.

¡Muchas gracias de antemano!


Puede ver cualquier posición de UIElement en relación con otro UIElement utilizando la llamada UIElement.TransformToVisual .

Primero, obtenga la transformación entre TextBox y ScrollViewer.

GeneralTransform transform = textBox.TransformToVisual(scrollViewer);

Luego, descubra qué punto (0,0) de TextBox es relativo al ScrollViewer. Lo que significa que el origen de TextBox (0,0) se encuentra en la posición de ScrollViewer.

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

Ahora que conoce la posición Y del TextBox relativo al ScrollViewer, desplácese a ese desplazamiento Y.

scrollViewer.ScrollToVerticalOffset(textBoxPosition.Y);

¡Buena suerte!