UWP中导航至其他Frame时如何切换NavigationView选中项?
你遇到的这个场景很典型——当从页面内部调用Frame.Navigate切换页面时,NavigationView并不会自动同步更新它的SelectedItem,所以需要我们手动处理两者的状态匹配。下面给你两种可行的解决方案:
方案一:直接在点击事件中设置选中项
在你的EachTvProgram_Click方法里,添加代码找到MainPage中的NavigationView,并将对应的Player项设置为选中状态:
首先确保你引用了System.Linq命名空间(因为要用到LINQ查询),然后修改点击事件代码:
private void EachTvProgram_Click(object sender, ItemClickEventArgs e) { var nextPlaying = (TvProgram)e.ClickedItem; TvProgramManager.PlayingProgram = nextPlaying.Title; ChannelDetails.IsPaneOpen = false; Frame.Navigate(typeof(PlayerPage)); // 新增:同步NavigationView选中项 var mainPage = Window.Current.Content as MainPage; if (mainPage != null) { // 通过Tag找到Player对应的NavigationViewItem var playerNavItem = mainPage.MyNavigationView.MenuItems .OfType<NavigationViewItem>() .FirstOrDefault(item => item.Tag?.ToString() == "player"); if (playerNavItem != null) { mainPage.MyNavigationView.SelectedItem = playerNavItem; } } }
这个方法直接在触发导航的地方手动设置选中项,适合页面较少的简单场景。
方案二:监听Frame导航事件实现自动同步
如果你的应用后续会新增更多页面,推荐用这种更通用的方式:在MainPage中监听Frame的Navigated事件,根据导航到的页面类型自动匹配对应的NavigationViewItem。
- 在MainPage的构造函数或者
OnNavigatedTo方法中添加事件监听:
public MainPage() { this.InitializeComponent(); // 监听Frame的导航事件 MyFrame.Navigated += MyFrame_Navigated; }
- 实现导航事件的处理逻辑:
private void MyFrame_Navigated(object sender, NavigationEventArgs e) { NavigationViewItem targetItem = null; // 根据导航到的页面类型匹配对应的NavigationViewItem switch (e.SourcePageType.Name) { case nameof(ChannelsPage): targetItem = MyNavigationView.MenuItems .OfType<NavigationViewItem>() .FirstOrDefault(item => item.Tag?.ToString() == "channels"); break; case nameof(PlayerPage): targetItem = MyNavigationView.MenuItems .OfType<NavigationViewItem>() .FirstOrDefault(item => item.Tag?.ToString() == "player"); break; // 后续新增页面可以在这里继续添加case } if (targetItem != null) { MyNavigationView.SelectedItem = targetItem; } }
这种方式的好处是,不管是通过NavigationView的菜单点击导航,还是从页面内部触发导航,选中项都会自动同步,不需要在每个导航的地方重复写设置代码,扩展性更强。
两种方案都能解决你当前的问题,你可以根据自己的应用复杂度选择合适的方式~
内容的提问来源于stack exchange,提问作者Zixuan
相关产品推荐
相关产品推荐

