- A+
所属分类:.NET技术
通常,导航意味着某个Control被添加到UI中,与此同时另一个Control被移除。
简单跳转
-
新建
UserControl
,新建ViewModel,VM需要实现INavigationAware
-
注册
UserControl
到DryIoc容器
containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
- 在XAML中需要导航的地方声明Region
<ContentControl prism:RegionManager.RegionName="ContentRegion" />
- 在需要导航的地方(VM或后置代码中)注入
IRegionManager
并请求导航(关于Prism
中的Region
可见我的另一篇随笔)
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); }
导航后执行回调
请求导航时可以添加一个回调方法用于导航成功后被使用
void RequestNavigate( string regionName, string source, Action<NavigationResult> navigationCallback );
一个例子:
private void Navigate(string navigatePath) { if (navigatePath != null) _regionManager.RequestNavigate("ContentRegion", navigatePath, NavigationComplete); } private void NavigationComplete(NavigationResult result) { System.Windows.MessageBox.Show(String.Format("Navigation to {0} complete. ", result.Context.Uri)); }
被导航视图的复用
每个能够被导航的视图的VM都需要实现 INavigationAware
接口,接口中有一个 IsNavigationTarget
方法,它用于表明当前视图是否可以被导航复用,如果直接返回 true
,那么导航时将总是使用同一个实例。
也可以根据条件返回 false
以使用新的VM实例。
被导航视图的生命周期
当导航到新的视图之后, 之前的视图就成了deactive状态。
可以通过实现 IRegionMemberLifetime
并重写 KeepAlive
的 get
方法来自定义什么情况下销毁页面,使每次页面处于 deactivated
状态时 ViewModel 对象被销毁,再次导航到被销毁页面后重新创建新 ViewModel 对象。
public class ViewBViewModel : BindableBase, INavigationAware, IRegionMemberLifetime { public bool KeepAlive => false; // ...
导航时携带参数
private void PersonSelected(Person person) { var parameters = new NavigationParameters(); parameters.Add("person", person); if (person != null) _regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetail", parameters); }
public void OnNavigatedTo(NavigationContext navigationContext) { var person = navigationContext.Parameters["person"] as Person; if (person != null) SelectedPerson = person; }
TabControl与Prism导航
在 TabControl
中声明 RegionName
,在导航时会自动添加 TabPage
。