2013-02-27 6 views
5

Ich hoffe, das ist kein Duplikat, aber ich kann keine Dokumentation oder Beispiele finden, wie man tatsächlich verwendenScrollToVerticalOffset(). Ich benutze es in einer Windows Phone 8 App, aber ich denke es wird immer noch auf WP7 und Silverlight angewendet (obwohl, fühlen Sie sich frei, mich zu korrigieren, wenn ich falsch liege).Wie ScrollViewer.ScrollToVerticalOffset verwenden?

So, hier ist meine grundlegenden Einrichtung (Pseudo-Code aus dem Gedächtnis):

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

So wie Sie sehen können, habe ich eine ScrollViewer innerhalb eines PivotItem haben, und im Inneren ist eine Grid. In der Grid gibt es etwa 20 TextBox s, jeweils innerhalb einer Border. Ich setze den Fokus dynamisch auf einen dieser TextBox s, wenn diese Seite geladen wird, also stelle ich den Fokus immer auf TextBox # 6-20 (ungefähr) - ich muss manuell nach unten scrollen, um ihn zu sehen. Ich möchte meine ScrollViewer automatisch scrollen, so dass, egal welcher TextBox Fokus hat, es für den Benutzer zentriert sein wird zu sehen.

Die documentation für ScrollToVerticalOffset() sagt:

Scrolls der Inhalt, der auf die angegebene vertikal versetzter Position innerhalb des Scroll ist.

Und dass es eine Art von System.Double akzeptiert.

Was ich nicht verstehe, ist A) der Wert, den ich weitergeben soll, und B) wie ich diesen Wert überhaupt bekommen könnte? Soll es eine Zahl zwischen 0 und der Höhe meines Grid (1500) sein? Wenn ja, wie könnte ich die Position eines gegebenen TextBox bestimmen, damit ich zu ihm blättern kann?

Wenn es irgendwelche einfachen Beispiele gibt, wenden Sie sich bitte an sie. Ich bin mir nicht sicher, ob der Inhalt der ScrollViewer beim Aufruf dieser Methode eine Rolle spielt, aber für den Fall, dass es funktioniert, wollte ich genau zeigen, wie ich es benutze.

Vielen Dank im Voraus!

+0

Kleine Frage, warum haben Sie dieses Setup implementiert? Gibt es einen Grund, warum Sie den Longlist-Selector nicht verwenden sollten?Ich habe mich gefragt :) – Depechie

+0

Gute Frage - Ich nehme an, der Hauptgrund ist, dass ich 'LongListSelector' nicht kannte, und ich habe nicht genug Forschung getan, um zu wissen, ob es eine bessere Option wäre oder nicht. Im Grunde mache ich eine "Top-Ten-Leaderboard" -Typ-Sache, die die Top-Ten-Namen und Scores anzeigen wird. Wenn eine neue Punktzahl> als die 10. Punktzahl ist, füge ich eine 'TextBox' in die richtige Position ein und lasse sie vom Benutzer speichern. Der obige Pseudo-Code spiegelt jedoch offensichtlich nicht alle diese Funktionen wider. – lhan

+0

Also in meinem tatsächlichen Szenario gibt es 10 verschiedene 'TextBlocks', die ich als Bezeichnungen verwende, und dann werden sie für den" neuen Eintrag "angepasst/verschoben und eine' TextBox' wird an ihren Platz gesetzt, um den Benutzer speichern zu lassen ihr Name in diese Position. – lhan

Antwort

10

Sie können die Position eines UIElements relativ zu einem anderen UIElement mithilfe des Aufrufs UIElement.TransformToVisual anzeigen.

Zuerst erhalten Sie die Umwandlung zwischen der TextBox und ScrollViewer.

Dann, herauszufinden, welcher Punkt (0,0) der TextBox relativ zum ScrollViewer ist. Das heißt, der TextBox-Ursprung (0,0) befindet sich an der ScrollViewer-Position.

Jetzt, da Sie die Y-Position der TextBox relativ zum ScrollViewer kennen, scrollen Sie zu dieser Y-Verschiebung.

scrollViewer.ScrollToVerticalOffset(textBoxPosition.Y); 

Viel Glück!

+0

Funktioniert perfekt. Danke noch einmal! – lhan