Zentrieren ausgewählte Element in einer scroll-viewer
Ich versuche zu center ein ausgewähltes Element in einem ListView-Steuerelement innerhalb eines ScrollViewer und kämpfen, um die Berechnung der vertikalen Versatz, ich sollte die Einstellung des ScrollViewer-Element relativ zu der ListView.
Den folgenden links stellen Sie mich auf die richtige Spur, aber wegen der Einschränkung der WinRT-API, war nicht in der Lage, Sie zu nutzen:
- Machen ListView.ScrollIntoView Blättern Sie das Element in der Mitte des ListView (C#)
- http://blogs.msdn.com/b/delay/archive/2009/04/19/fewer-gotchas-to-getcha-enhancing-the-scrollintoviewcentered-method-for-wpf-s-listbox.aspx
Der gewünschte Effekt ist wie folgt:
Dies ist ein Beispiel-setup in meinem XAML:
<ScrollViewer x:Name="MyScrollViewer">
<ListView x:Name="MyView" VerticalAlignment="Center"
SelectionChanged="Selector_OnSelectionChanged">
<ListView.ItemTemplate>
<DataTemplate>
<Grid Width="80" Height="80" Margin="0">
<TextBlock Text="{Binding}" />
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
<ListView.Items>
<x:String>1</x:String>
<x:String>2</x:String>
<x:String>3</x:String>
<x:String>4</x:String>
<x:String>5</x:String>
<x:String>6</x:String>
<x:String>7</x:String>
<x:String>8</x:String>
<x:String>9</x:String>
</ListView.Items>
</ListView>
</ScrollViewer>
Kenntnis der index des ausgewählten Elements, wie kann ich berechnen, den vertikalen offset, die ich verwenden kann bei meiner Methode:
private void Selector_OnSelectionChanged(object sender, SelectionChangedEventArgs e)
{
double maxVerticalOffset = MyScrollViewer.ExtentHeight - MyScrollViewer.ViewportHeight;
int selectedItemIndex = MyView.SelectedIndex;
double verticalOffset = ...
MyScrollViewer.ChangeView(null, verticalOffset, null);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Versuchen
ListView.ScrollIntoView()
oderListView.MakeVisible
ersten Blättern den container des Elements in anzeigen und umgehen, die möglicherweise virtualisierte aus der UI. Dann verwendenListView.ItemContainerGenerator
.
ContainerFromIndex
() , um die container von den Artikel und dann denVisualTreeHelper
um seine position relativ zu denScrollViewer
. Dann scrollen Sie in der scrollviewer um den berechneten offset.*BEARBEITEN - Beispiel Positionier-Logik:
Holen Sie sich die VisualTreeHelperExtensions von WinRT XAML Toolkit, um Zugang zu den
ScrollViewer
leicht mitGetFirstDescendantOfType()
Erweiterung Methode umschließt, die einige Aufrufe an dieVisualTreeHelper
.XAML
C#
VisualTreeHelper
um die position der ausgewählten listview-Element in der Mitte des scroll-viewer?ListViewItem listViewItem = (ListViewItem)listView.ContainerFromItem(listView.SelectedItem);
. Jedoch, Ihre Berechnung, die ich nicht ganz verstehen, seine Logik ist sehr aus aus zentriert in der Mitte des ScrollViewer-Element. Vielleicht kannst du ein Beispiel getestet?ListView
mit einemScrollViewer
Kontrolle. Ich wusste nicht, dass dieListView
Moderator selbst enthielt eineScrollViewer
gebaut, die ich verwenden sollten, um Koordinaten an und aus.VisualTreeHelperExtensions
. Sie können schnappen Sie sich die Datei oder einfach nur die Methode oder bekommen Sie das gesamte toolkit von NuGet.Yup, das funktionierte bei mir out of the box mit ScrollIntoView