Прокрутите до выбранного элемента в NavigationView UWP. - PullRequest
0 голосов
/ 04 ноября 2019

Мне нужно прокрутить NavigationView до SelectedItem. В котором я попробовал ниже методы один с TryMoveFocusAsync, а другой, пытаясь получить ScrollViewer через родителя события SelectedItem из SelectionChanged. Но родительский элемент кажется нулевым.

Примечание. NavigationView не имеет ScrollIntoView, как ListView

1-й метод

   private async void OnSelectionChanged(
         NavigationView sender, NavigationViewSelectionChangedEventArgs args)
   {
        if (args.SelectedItem is NavigationViewItem item)
        {
           FocusManager.TryFocusAsync(
                    sender.SelectedItem as DependencyObject,
                    FocusState.Pointer);
           ViewModel.NavigateTo(item.Name);
         }
         UpdateBackButton();
   }

2-й метод

   private async void OnSelectionChanged(
        NavigationView sender, NavigationViewSelectionChangedEventArgs args)

(args.SelectedItem as NavigationViewItem).Parent возвращает ноль.

Есть ли способ прокрутить NavigationViewMenuItem до выбранного индекса?

1 Ответ

1 голос
/ 04 ноября 2019

Поскольку удобный метод ScrollIntoView недоступен за пределами ListView, сделать это немного больше. Сначала нам нужно написать вспомогательный метод, который находит родителя DependencyObject, используя VisualTreeHelper:

private T FindParentOfType<T>(DependencyObject item)
{
    while (item != null)
    {
        item = VisualTreeHelper.GetParent(item);
        if (item is T expectedParent)
        {
            return expectedParent;
        }
    }
    return default;
}

Теперь, используя это, мы сначала находим ScrollViewer (который должен бытьродительский элемент NavigationViewItem):

var scrollViewer = FindParentOfType<ScrollViewer>(item);

Теперь нам нужно выяснить положение этого пункта меню в средстве просмотра прокрутки, что можно сделать с помощью TransformToVisual и TransformPoint. Зная это вертикальное местоположение, мы можем теперь прокрутить его, используя ScrollViewer.ChangeView метод:

if (scrollViewer != null)
{
    var transform = 
         item.TransformToVisual(scrollViewer)
             .TransformPoint(new Point(0,0));
    scrollViewer.ChangeView(null, transform.Y, null);
}
...