在应用程序开发中,页面导航是一个核心功能,它允许用户在不同的视图或页面间切换。不同的平台有着不同的页面导航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);
}
回到Page1ViewModel,可以看到一个名为NavigateToPage2Command的ActionCommand,它调用view-model的NavigateToPage2方法。以下是Page1ViewModel NavigateToPage2方法的代码:
void NavigateToPage2(object arg)
{
navigationService.Navigate(Routes.Page2);
}
要总结的是:使用IRoutingService将URL与执行实际导航的动作关联起来。使用INavigationService导航到URL。
在每个平台的Page1视图中都有一个按钮,绑定到NavigateToPage2Command。当激活按钮时,UWP/WPF/Android应用程序将导航到Page 2。在Page 2上有一个按钮绑定到Page2ViewModel类的NavigateBackCommand。当命令执行时,INavigationService被调用以执行后退导航,如下所示:
void NavigateBack(object arg)
{
navigationService.GoBack();
}
每个平台特定的INavigationService实现都知道如何为其特定平台执行后退导航。