代码之家  ›  专栏  ›  技术社区  ›  Vincent

如何在打开时避免第一个navigationview项?

  •  0
  • Vincent  · 技术社区  · 4 年前

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

    我最初的想法是创建一个导航菜单,如 Android ,当按下 Left 按钮,打开导航菜单,并将焦点放在相应的项上。

    例如,当我在设置页面中,当前焦点在 Button 按钮,按钮 导航视图 Settings 项目。

    这是你的名字 repo 你可以在pc/xbox上运行它。

    你可以看录像 here

    enter image description here

    0 回复  |  直到 4 年前
        1
  •  2
  •   Richard Zhang    4 年前

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

    1. 正常开放
    2. 应用程序自动聚焦于MenuItems(自动选择第一项)
    3. 在中重置选项的焦点 PaneOpened

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

    外壳页.xaml

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

    shell页面.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;
        }
    }
    

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

    谢谢。