2013-02-27 4 views
5

Spero che questo non sia un duplicato ma non riesco a trovare alcuna documentazione o esempi su come effettivamente utilizzare ScrollToVerticalOffset(). Lo sto utilizzando in un'app di Windows Phone 8, ma penso che si applicherà ancora a WP7 e Silverlight (anche se, sentiti libero di correggermi se sbaglio).Come utilizzare ScrollViewer.ScrollToVerticalOffset?

ecco il mio set up di base (pseudo-codice dalla 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> 

Quindi, come potete vedere, ho un ScrollViewer all'interno di un PivotItem, e al suo interno è un Grid. Nel Grid ci sono circa 20 TextBox s, ognuno all'interno di un Border. Sto impostando dinamicamente l'attenzione su uno di questi TextBox quando questa pagina viene caricata, quindi ogni volta che imposto lo stato attivo su TextBox # 6-20 (approssimativamente) - Devo scorrere manualmente verso il basso per vederlo. Voglio scorrere automaticamente il mio ScrollViewer in modo che, a prescindere dal fatto che lo TextBox sia attivo, verrà centrato affinché l'utente possa vederlo.

Il documentation per ScrollToVerticalOffset() dice:

Scorre il contenuto che si trova all'interno del ScrollViewer al posizione di offset verticale specificato.

E che accetta un tipo di System.Double.

Quello che non capisco è A) il valore che dovrei passare, e B) come potrei ottenere quel valore? Dovrebbe essere un numero compreso tra 0 e l'altezza del mio Grid (1500)? In tal caso, come è possibile determinare la posizione di ogni dato TextBox in modo che possa scorrere fino ad esso?

Se ci sono degli esempi semplici, non esitate a collegarli. Non sono sicuro che il contenuto all'interno dello ScrollViewer importi quando si chiama questo metodo, ma nel caso in cui lo desideri, voglio mostrare esattamente come lo sto usando.

Molte grazie in anticipo!

+0

Piccola domanda, perché hai implementato questa configurazione? Qualche ragione per non usare il longlistselector?Mi stavo chiedendo :) – Depechie

+0

Buona domanda - Suppongo che la ragione principale sia che non avevo familiarità con 'LongListSelector', e non ho fatto abbastanza ricerche per sapere se sarebbe stata un'opzione migliore o meno. Fondamentalmente, sto facendo una cosa tipo "top ten leaderboard" che mostrerà i primi dieci nomi e punteggi. Se un nuovo punteggio> supera il 10 ° punteggio, inserirò un 'TextBox' nella posizione corretta e l'utente lo salverà. Il mio pseudo-codice sopra ovviamente non riflette tutte queste funzionalità. – lhan

+0

Quindi, nel mio scenario attuale, ci sono 10 diversi 'TextBlocks' che sto usando come etichette, e poi vengono modificati/spostati per la" nuova voce "e un' TextBox' è messo nella sua posizione per consentire all'utente di salvare il loro nome in quella posizione. – lhan

risposta

10

È possibile visualizzare qualsiasi posizione di UIElement relativa a un altro UIElement utilizzando la chiamata UIElement.TransformToVisual.

Innanzitutto, ottenere la trasformazione tra TextBox e ScrollViewer.

GeneralTransform transform = textBox.TransformToVisual(scrollViewer); 

Quindi, capire che punto (0,0) del TextBox è relativo a ScrollViewer. Significato, l'origine del TextBox (0,0) si trova in corrispondenza della posizione di ScrollViewer.

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

Ora che si conosce la posizione Y del controllo TextBox rispetto al ScrollViewer, scorrere fino a quella di offset Y.

scrollViewer.ScrollToVerticalOffset(textBoxPosition.Y); 

Buona fortuna!

+0

Funziona perfettamente. Grazie ancora! – lhan