You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UWP中导航至其他Frame时如何切换NavigationView选中项?

解决UWP NavigationView选中项与Frame导航不同步的问题

你遇到的这个场景很典型——当从页面内部调用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。

  1. 在MainPage的构造函数或者OnNavigatedTo方法中添加事件监听:
public MainPage()
{
    this.InitializeComponent();
    // 监听Frame的导航事件
    MyFrame.Navigated += MyFrame_Navigated;
}
  1. 实现导航事件的处理逻辑:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:33:22