滚动到NavigationView UWP中的选定项目

时间:2019-11-04 11:31:15

标签: c# uwp uwp-xaml

我需要滚动NavigationView到其SelectedItem。在下面的方法中,我尝试使用一种方法TryMoveFocusAsync,另一种方法是通过从ScrollViewer事件中通过SelectedItem的父级获取SelectionChanged。但是,父母似乎是空的。

注意:NavigationView没有像ScrollIntoView这样的ListView

第一种方法

   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();
   }

第二种方法

   private async void OnSelectionChanged(
        NavigationView sender, NavigationViewSelectionChangedEventArgs args)

(args.SelectedItem as NavigationViewItem).Parent返回null。

是否可以将NavigationViewMenuItem滚动到其选定的索引?

1 个答案:

答案 0 :(得分:1)

由于google_auth_oauthlib之外没有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