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:

L'effet désiré est comme suit:

Centrage de l'élément sélectionné dans un rouleau de la visionneuse

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);
}
InformationsquelleAutor Hady | 2014-03-23