基本的区域导航
视图注入(View Injection)和视图发现(View Discovery)都可以被认为是有限的导航形式。视图注入是一种显式的和程序化的导航形式,而视图发现是一种隐式的或延迟的导航形式。不过在Prism中的区域已被扩展,以支持基于URI和可扩展导航机制的更通用的导航概念。
区域内的导航意味着将在该区域内显示新视图。其中要显示的视图是通过URI标识的,默认情况下URI指的是要创建的视图名称。你可以使用INavigateAsync接口定义的RequestNavigate方法以编程的方式初始化导航。
注意: 尽管名字叫INavigateAsync,但接口并不表示是在单独的后台线程上执行的异步导航。相反INavigateAsync接口表示的是执行伪异步导航的能力。因为RequestNavigate方法可能会在导航操作完成后同步返回,也可能会在导航操作尚未完成时返回,比如用户需要确认导航的时候。Prism通过允许您在导航期间指定回调和延续,并提供了一种机制来支持这些场景,从而避免了在后台线程上进行导航的复杂性。
INavigateAsync接口由Region类实现,允许你在该区域内初始化导航。
IRegion mainRegion = ...;
mainRegion.RequestNavigate(new Uri("InboxView", UriKind.Relative));
您还可以使用更简单的字符串参数的重载:
IRegion mainRegion = ...;
mainRegion.RequestNavigate("InboxView");
你也可以调用RegionManager中的RequestNavigate方法,它允许你指定要导航的region的名称。这个简便的方法会获取指定区域的引用,然后调用如前面的代码示例所示的RequestNavigate方法。
IRegionManager regionManager = ...;
regionManager.RequestNavigate("MainRegion", new Uri("InboxView", UriKind.Relative));
同上,您也可以使用字符串参数的重载来导航:
IRegionManager regionManager = ...;
regionManager.RequestNavigate("MainRegion", "InboxView");
默认情况下,导航URI指定了在容器中注册的视图名称。
在导航过程中,会通过容器实例化指定的视图及其对应的视图模型和其他依赖的服务和组件。在视图被实例化之后,它会被添加到指定的区域并被激活。详情请参阅视图和视图模型参与导航。
注意: 前面的描述讲明了视图优先导航,其中URI指的是在容器中注册的视图类型的名称。在使用视图优先导航时,相关的视图模型会被创建为视图的依赖项。另一种方法是使用视图模型优先导航,其中导航URI指的是在容器中注册的视图模型类型的名称。在当视图被定义为数据模板或者当您希望独立于视图定义导航方案时,视图模型优先导航会很有用。
RequestNavigation方法还允许您指定一个回调方法或委托,当导航完成时将调用该方法。
private void SelectedEmployeeChanged(object sender, EventArgs e)
{
...
regionManager.RequestNavigate(RegionNames.TabRegion, "EmployeeDetails", NavigationCompleted);
}
private void NavigationCompleted(NavigationResult result)
{
...
}
NavigationResult类定义了提供导航操作信息的属性。其中Result属性表示导航是否成功。如果导航成功,那么Result属性将为 true。如果导航失败,通常是因为在IConfirmNavigationResult.ConfirmNavigationRequest方法中返回'continuationCallBack(false)',那么Result属性将是 false。如果是由于异常导致的导航失败,Result属性将会是 false,Error属性会提供在导航期间抛出异常的引用。Context属性提供了对导航URI及其包含参数的访问,以及对协调导航操作的导航服务的引用。