Lassen ListView scrollen, um ausgewählte Element
Habe ich ein WinRT, C#/XAML-app mit einer Ansicht, die eine vertikale ListView-Elemente. Abhängig von der Anzahl der Elemente der ListView zeigt eine vertikale Bildlaufleiste. Hier ist der XAML-definition:
<UserControl.Resources>
<CollectionViewSource
x:Name="myViewSource"
Source="{Binding myViewModel.Items}" />
</UserControl.Resources>
...
<ListView
x:Name="myListView"
ItemsSource="{Binding Source={StaticResource myViewSource}}"
SelectedItem="{Binding SelectedItem, Mode=TwoWay}">
</ListView>
Nun jedes mal wenn ich navigieren Sie zu dieser Ansicht, wird das ausgewählte Element der ListView wird gewählt durch die Einstellung der Datenbindung SelectedItem-Eigenschaft in der Ansicht Modell von code behind (OnNavigatedTo
). Mein problem: die ListView nicht automatisch scrollen, um das ausgewählte Element. Die scrollbar bleibt an der Spitze der ListView und der Benutzer muss scrollen Sie manuell finden Sie das ausgewählte Element.
Habe ich versucht auszuführen myListView.ScrollIntoView(MyViewModel.SelectedItem);
nach der Einstellung der SelectedItem in der code-behind (in OnNavigatedTo
), aber es funktioniert nicht. Die scrollbar bleibt an der Spitze.
Ich bin mir bewusst, dass dieser thread auf SO: Blättern WinRT ListView bestimmten Gruppe .
Dies scheint ein ähnliches problem. Aber wenn ich zu Fuß die visuelle Struktur des ListView-manuell oder mit WinRT XAML Toolkit, es findet kein ScrollViewer (gibt null zurück, statt).
- Warten Sie auf das ListView-Steuerelement zu laden (werden Hinzugefügt, um die visuelle Struktur), bevor Sie versuchen zu scrollen?
- Ich rufe ScrollIntoView() in OnNavigatedTo(). Ich dachte, hier wäre der richtige Ort und die ListView soll geladen wurden. Oder kann ich falsch sein?
- Ich denke, OnNavigatedTo-Auftritt, bevor das Steuerelement geladen wird...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank Filip bemerkte ich, dass der Aufruf
ScrollIntoView()
imOnNavigatedTo()
war zu früh, denn derListView
Kontrolle ist noch nicht geladen, die in diesem Ort.Ersten Lösung wurde die Idee zu binden, die
Loaded
- Ereignis des ListView:Leider das verursacht eine unangenehme visuelle Wirkung, wo die aktuellen ListView-Elemente überschneiden sich mit den ausgewählten Elements für Teile einer Sekunde, bevor alles ist neu, gut.
Die Letzte Lösung, die ich gefunden, ist zu nennen
ScrollIntoView()
asynchron über dieDispatcher
der Ansicht:Mit dieser Lösung das Layout funktioniert gut.
Hatte ich ein ähnliches Bedürfnis und gelöst, es auf eine etwas andere Art und Weise. Ich habe ein Abonnement, um die SelectionChangedEvent aus dem ListView und durchgeführt, das scrollen innerhalb der Prozedur.
XAML:
Code: