页面导航与路由服务

在应用程序开发中,页面导航是一个核心功能,它允许用户在不同的视图或页面间切换。不同的平台有着不同的页面导航API,例如UWP允许使用页面类型进行导航,WPF则使用页面实例,而Android则使用Intents。为了简化这些差异,Codon框架提供了一个路由系统,允许注册一个字符串URL与一个关联的动作。当导航服务接收到导航到特定URL的请求时,就会调用与该URL关联的动作。

路由服务的理解

Codon框架不需要手动引导启动(bootstrapping),它会执行各种默认的IoC容器注册。但是,如果想使用Codon的导航服务进行除了后退导航以外的操作,需要配置它的路由。在示例中,每个平台项目都有一个名为Bootstrapper的类,其唯一目的是配置路由服务。

在UWP示例项目中,Bootstrapper类通过IoC容器获取IRoutingService,并注册URL “/Page2”与一个调用Bootstrapper类Navigate方法的动作。以下是UWP示例Bootstrapper类的代码:

public void Run() { var routingService = Dependency.Resolve(); routingService.RegisterPath(Routes.Page2, Navigate); }

Navigate方法会调用非泛型的Navigate方法,然后从Window获取Frame对象,并使用页面类型作为参数调用其Navigate方法。

WPF示例的Bootstrapper与UWP类似,不同之处在于其Navigate方法。WPF的INavigationService实现包含一个方便的辅助方法,它可以从当前Frame或Window中找到内置的System.Navigation.NavigationService。以下是WPF示例Bootstrapper Navigate方法的代码:

void Navigate(Type pageType) { var navigationService = (NavigationService)Dependency.Resolve(); var page = Dependency.ResolveWithType(pageType); navigationService.Navigate(page); }

Android示例的Bootstrapper类与其他平台类似,主要区别在于它使用Android的Intents。Bootstrapper类的Run方法获取IRoutingService实例,并注册一个Page 2路由与一个调用LaunchActivity方法的动作。以下是Android示例Bootstrapper LaunchActivity方法的代码:

void LaunchActivity(int requestCode) { LaunchActivity(typeof(TActivity), requestCode); } void LaunchActivity(Type activityType, int requestCode) { var activity = Dependency.Resolve(); Intent intent = new Intent(activity, activityType); activity.StartActivityForResult(intent, requestCode); }

通过ViewModel命令进行导航

回到Page1ViewModel,可以看到一个名为NavigateToPage2Command的ActionCommand,它调用view-model的NavigateToPage2方法。以下是Page1ViewModel NavigateToPage2方法的代码:

void NavigateToPage2(object arg) { navigationService.Navigate(Routes.Page2); }

要总结的是:使用IRoutingService将URL与执行实际导航的动作关联起来。使用INavigationService导航到URL。

通过ViewModel命令进行后退导航

在每个平台的Page1视图中都有一个按钮,绑定到NavigateToPage2Command。当激活按钮时,UWP/WPF/Android应用程序将导航到Page 2。在Page 2上有一个按钮绑定到Page2ViewModel类的NavigateBackCommand。当命令执行时,INavigationService被调用以执行后退导航,如下所示:

void NavigateBack(object arg) { navigationService.GoBack(); }

每个平台特定的INavigationService实现都知道如何为其特定平台执行后退导航。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485