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

迁移UWP应用至Template10:为自定义Shell创建NavigationService

为自定义Shell的ContentFrame获取Template10的INavigationService

嘿,我之前在迁移UWP项目到Template10时,也遇到过保留自定义Shell并关联NavigationService的需求,刚好能给你一套可行的方案:

核心思路

Template10允许我们为任意Frame实例创建专属的INavigationService,不用强制使用框架自带的汉堡菜单模板。关键就是用NavigationServiceFactory类绑定你的ContentFrame,让框架接管导航逻辑,同时保留你现有Shell的所有自定义特性。

具体实现步骤

  1. 引入必要的命名空间
    在你的自定义Shell代码文件顶部,添加Template10导航相关的命名空间:

    using Template10.Navigation;
    
  2. 创建并绑定NavigationService
    在Shell的初始化逻辑(比如构造函数或者Loaded事件)中,为ContentFrame创建INavigationService。如果需要全局可用,可以把它设为Shell的静态属性:

    public sealed partial class CustomShell : Page
    {
        // 全局可访问的NavigationService实例
        public static INavigationService NavigationService { get; private set; }
    
        public CustomShell()
        {
            this.InitializeComponent();
            SetupNavigationService();
        }
    
        private void SetupNavigationService()
        {
            // 为ContentFrame创建NavigationService,可选绑定回退/前进按钮
            NavigationService = NavigationServiceFactory.CreateForFrame(
                frame: ContentFrame,
                backButton: YourBackButtonControl, // 如果Shell有回退按钮,填这里
                forwardButton: null // 没有前进按钮就传null
            );
    
            // 订阅导航事件,和你现有自定义逻辑结合
            NavigationService.Navigated += OnNavigationCompleted;
        }
    
        private void OnNavigationCompleted(object sender, NavigationEventArgs e)
        {
            // 这里可以加入你原有的导航后处理逻辑,比如更新汉堡菜单选中项、修改标题等
        }
    }
    
  3. 统一使用NavigationService处理导航
    之后所有页面导航都要通过这个NavigationService来完成,而不是直接调用ContentFrame.Navigate,这样才能保证Template10的回栈管理、导航状态跟踪等功能正常工作:

    // 在ViewModel或页面中导航到目标页面
    CustomShell.NavigationService.Navigate(typeof(YourTargetPage));
    
    // 处理回退操作(比如汉堡菜单的回退按钮点击)
    CustomShell.NavigationService.GoBack();
    

注意事项

  • 避免混用导航方式:不要同时使用ContentFrame.Navigate和NavigationService.Navigate,否则会破坏框架的导航状态管理。
  • 导航缓存设置:ContentFrame的NavigationCacheMode会被NavigationService尊重,如果有特殊缓存需求,可以通过NavigationService的配置调整。
  • 多Frame场景:如果你的Shell有多个Frame,每个都可以通过NavigationServiceFactory.CreateForFrame创建独立的INavigationService,互不干扰。

内容的提问来源于stack exchange,提问作者SebastianR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:01:46