繁体   English   中英

滚动到 NavigationView UWP 中的选定项目

[英]Scroll to selected item in NavigationView UWP

我需要将NavigationView滚动到其SelectedItem 在其中我尝试了以下方法,一种是TryMoveFocusAsync ,另一种是通过从SelectionChanged事件中通过SelectedItem的父项获取ScrollViewer 但是,父母似乎是 null。

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

第一种方法

   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滚动到其选定的索引?

因为ScrollIntoView便利方法在ListView之外不可用,所以要完成这项工作需要做更多的工作。 首先,我们需要编写一个辅助方法,使用VisualTreeHelper查找DependencyObject的父对象:

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

我们现在需要在滚动查看器中找出此菜单项的 position,这可以使用TransformToVisualTransformPoint来完成。 知道了这个垂直位置,我们现在可以使用ScrollViewer.ChangeView方法滚动到它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM