打开时如何避免第一个导航视图项目聚焦?

How to avoid the first navigationview item focused when opening?

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

我最初的想法是创建一个类似Android的导航菜单,当在页面中按下Left按钮时,打开导航菜单,并聚焦到相应的项目。

例如,当我在“设置”页面中时,当前焦点在 Button 上。当我按下 Left 按钮时,NavigationView 打开并聚焦于 Settings 项目。

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

这是可以重现错误的 repo,您可以 运行 在 pc/xbox.

您可以看到视频here

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

这似乎是默认行为,因为您 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;
    }
}

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

谢谢。