0x6Navigation Basic Navigation
Prism中的Navigation提供了一种类似导航的功能,他可以根据用户的输入,来刷新UI。
先看一个最简单的例子,通过按钮来导航到一个视图,在这里,视图被注册为Navication。
public void Initialize() { _container.RegisterTypeForNavigation<ViewA>(); _container.RegisterTypeForNavigation<ViewB>(); }Shell 视图中设置两个Button并且绑定下面这个带参数的命令:
public DelegateCommand<string> NavigateCommand { get; private set; } public MainWindowViewModel(IRegionManager regionManager) { _regionManager = regionManager; NavigateCommand = new DelegateCommand<string>(Navigate); } private void Navigate(string navigatePath) { if (navigatePath != null) _regionManager.RequestNavigate("ContentRegion", navigatePath); } <DockPanel LastChildFill="True"> <StackPanel Orientation="Horizontal" DockPanel.Dock="Top" Margin="5" > <Button Command="{Binding NavigateCommand}" CommandParameter="ViewA" Margin="5">Navigate to View A</Button> <Button Command="{Binding NavigateCommand}" CommandParameter="ViewB" Margin="5">Navigate to View B</Button> </StackPanel> <ContentControl prism:RegionManager.RegionName="ContentRegion" Margin="5" /> </DockPanel>RegionManager通过RequestNavigate方法来获取已经注册的Navigation并且绑定到Region上去。
如果你获取Navigation后调用一个方法,来进行一些操作,比如当你调用Navigation成功后弹框提示调用成功,Prism为我们提供了一个RequestNavigate的重载方法:
void RequestNavigate(string regionName, string source, Action<NavigationResult> navigationCallback);navigationCallback就是你的回调函数,你可以在里面做一些事情。
有些时候,我们需要View或者ViewModel也参与到Navigation中来,比如当你Request一个Navigation的时候,希望navigation本身显示一些信息,为此 Prism为我们提供了一个INavigationAware 接口。
// // Summary: // Provides a way for objects involved in navigation to be notified of navigation // activities. public interface INavigationAware { // // Summary: // Called to determine if this instance can handle the navigation request. // // Parameters: // navigationContext: // The navigation context. // // Returns: // true if this instance accepts the navigation request; otherwise, false. bool IsNavigationTarget(NavigationContext navigationContext); // // Summary: // Called when the implementer is being navigated away from. // // Parameters: // navigationContext: // The navigation context. void OnNavigatedFrom(NavigationContext navigationContext); // // Summary: // Called when the implementer has been navigated to. // // Parameters: // navigationContext: // The navigation context. void OnNavigatedTo(NavigationContext navigationContext); }如果想要Navigation的目标也参与到Navigation的过程当中,只需要让你的viewmodel实现这个接口,然后在这些方法里编写你的代码就可以了。
IsNavigationTarget方法设置了是否被允许设置为导航的目标,当他的返回值为Fasle的时候,将不会被“导航”到它。在19-NavigationParticipation的例子中,Region的目标是:
<TabControl prism:RegionManager.RegionName="ContentRegion" Margin="5" />