1

我正在使用Windows Template Studio,并创建了一个NavigationView.

我最初的想法是创建一个类似的导航菜单Android,当按下Left页面中的按钮时,打开导航菜单,然后将注意力集中在相应的项目上。

例如,当我在设置页面中,当前焦点位于Button. 当我按下Left按钮时,NavigationView打开并专注于该Settings项目。

但是现在的焦点总是在第一个项目上,然后转到相应的项目上。

这是可以重现该错误的repo,您​​可以在 pc/xbox 上运行它。

你可以在这里看到视频。

那么如何避免打开时第一个navigationview项聚焦呢?

在此处输入图像描述

4

1 回答 1

2

这似乎是一种默认行为,因为您的焦点NavigationViewItem是手动设置的,在设置特定项目的焦点之前,它不会阻止 的默认焦点行为NavigationView,如下所示:

  1. 打开NavigationView
  2. 应用程序自动关注 MenuItems(自动选择第一项)
  3. PaneOpened您在事件中重置选项的焦点。

这个操作确实会引起焦点跳跃。为了避免这种情况,我们需要判断第一项何时获得焦点(strNaviTag用作参考):

ShellPage.xaml

<winui:NavigationViewItem x:Uid="Shell_Main" Icon="People" Tag="main" helpers:NavHelper.NavigateTo="views:MainPage" GettingFocus="FirstItem_GettingFocus"/>

ShellPage.xaml.cs

private void OnItemInvoked(WinUI.NavigationView sender, WinUI.NavigationViewItemInvokedEventArgs args)
{
    // ...
    (Application.Current as App).strNaviTag = item.Tag.ToString();
    // ...
}


private void NavigationViewItem_GettingFocus(UIElement sender, GettingFocusEventArgs args)
{
    if((Application.Current as App).strNaviTag != "main" 
        && !(args.OldFocusedElement is Microsoft.UI.Xaml.Controls.NavigationViewItem))
    {
        args.TryCancel();
        return;
    }
}

这可以防止在不满足要求时第一项获得焦点。

谢谢。

于 2020-05-13T01:49:32.520 回答