Centrage de l'élément sélectionné dans un rouleau de la visionneuse
Je suis en train de centre de l'élément sélectionné dans une liste à l'intérieur d'un ScrollViewer et de la difficulté à calculer le décalage vertical que je devrais mettre le ScrollViewer par rapport à la ListView.
Les liens suivants m'ont mis sur la bonne voie, mais à cause de la limitation de l'API WinRT, n'a pas été en mesure de les utiliser:
- Faire La Liste.ScrollIntoView de Défilement de l'Élément dans le Centre de la 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
L'effet désiré est comme suit:
Ceci est un exemple de configuration dans mon 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>
Connaître l'indice de l'élément sélectionné, comment dois-je calculer le décalage vertical que je peux utiliser dans ma méthode:
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);
}
Vous devez vous connecter pour publier un commentaire.
Essayer
ListView.ScrollIntoView()
ouListView.MakeVisible
premier pour faire défiler le conteneur de l'élément dans la vue et de travailler autour d'elle étant peut-être virtualisé de l'INTERFACE utilisateur. Ensuite, utilisezListView.ItemContainerGenerator
.
ContainerFromIndex
() pour obtenir le conteneur de l'élément, puis leVisualTreeHelper
pour obtenir sa position par rapport à laScrollViewer
. Ensuite, faites défiler la scrollviewer par le calcul de l'offset.*MODIFIER - Exemple de positionnement de la logique:
Obtenir le VisualTreeHelperExtensions de XAML Trousse d'outils pour accéder à la
ScrollViewer
facilement avecGetFirstDescendantOfType()
méthode d'extension qui enveloppe certains appels à l'VisualTreeHelper
.XAML
C#
VisualTreeHelper
à la position de l'élément de liste sélectionné dans le milieu de la faire défiler spectateur?ListViewItem listViewItem = (ListViewItem)listView.ContainerFromItem(listView.SelectedItem);
. Cependant, votre calcul que je n'ai pas tout à fait comprendre sa logique est très d'être centré au milieu de la ScrollViewer. Peut-être que vous pouvez publier une testé exemple?ListView
avec unScrollViewer
de contrôle. Je ne savais pas que leListView
présentateur lui-même contenait uneScrollViewer
construit en que je devrais être à l'aide de coordonnées de carte de et de.VisualTreeHelperExtensions
. Vous pouvez récupérer le fichier ou simplement à la méthode ou à obtenir la trousse d'outils complète à partir de NuGet.Yup, cela a fonctionné pour moi hors de la boîte avec ScrollIntoView