打开时如何避免第一个导航视图项目聚焦?
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
的默认焦点行为,像这样:
- 打开
NavigationView
- 应用自动关注MenuItems(第一项自动选中)
- 您在
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;
}
}
这可以防止第一项在不满足要求时获得焦点。
谢谢。
我正在使用 Windows Template Studio
,并创建了 NavigationView
。
我最初的想法是创建一个类似Android
的导航菜单,当在页面中按下Left
按钮时,打开导航菜单,并聚焦到相应的项目。
例如,当我在“设置”页面中时,当前焦点在 Button
上。当我按下 Left
按钮时,NavigationView
打开并聚焦于 Settings
项目。
但现在焦点总是在第一个项目上,然后转到相应的项目。
这是可以重现错误的 repo,您可以 运行 在 pc/xbox.
您可以看到视频here。
那么如何避免打开时第一个navigationview项被聚焦?
这似乎是默认行为,因为您 NavigationViewItem
的焦点是手动设置的,在设置特定项目的焦点之前,它不会阻止 NavigationView
的默认焦点行为,像这样:
- 打开
NavigationView
- 应用自动关注MenuItems(第一项自动选中)
- 您在
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;
}
}
这可以防止第一项在不满足要求时获得焦点。
谢谢。