翼度科技»论坛 编程开发 .net 查看内容

Prism导航

3

主题

3

帖子

9

积分

新手上路

Rank: 1

积分
9
通常,导航意味着某个Control被添加到UI中,与此同时另一个Control被移除。
简单跳转


  • 新建 UserControl,新建ViewModel,VM需要实现 INavigationAware
  • 注册 UserControl到DryIoc容器
  1. containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
复制代码

  • 在XAML中需要导航的地方声明Region
  1. [/code][list=1]
  2. [*]在需要导航的地方(VM或后置代码中)注入 IRegionManager 并请求导航(关于 Prism 中的Region 可见[url=https://www.cnblogs.com/bblitz/p/17495688.html]我的另一篇随笔[/url])
  3. [/list][code]public DelegateCommand<string> NavigateCommand { get; private set; }
  4. public MainWindowViewModel(IRegionManager regionManager)
  5. {
  6.     _regionManager = regionManager;
  7.     NavigateCommand = new DelegateCommand<string>(Navigate);
  8. }
  9. private void Navigate(string navigatePath)
  10. {
  11.     if (navigatePath != null)
  12.         _regionManager.RequestNavigate("ContentRegion", navigatePath);
  13. }
复制代码
导航后执行回调

请求导航时可以添加一个回调方法用于导航成功后被使用
  1. void RequestNavigate(
  2.     string regionName,
  3.     string source,
  4.     Action<NavigationResult> navigationCallback
  5. );
复制代码
一个例子:
  1. private void Navigate(string navigatePath)
  2. {
  3.     if (navigatePath != null)
  4.     _regionManager.RequestNavigate("ContentRegion", navigatePath, NavigationComplete);
  5. }
  6. private void NavigationComplete(NavigationResult result)
  7. {
  8.     System.Windows.MessageBox.Show(String.Format("Navigation to {0} complete. ", result.Context.Uri));
  9. }
复制代码
被导航视图的复用

每个能够被导航的视图的VM都需要实现 INavigationAware 接口,接口中有一个 IsNavigationTarget 方法,它用于表明当前视图是否可以被导航复用,如果直接返回 true,那么导航时将总是使用同一个实例。
也可以根据条件返回 false 以使用新的VM实例。
被导航视图的生命周期

当导航到新的视图之后, 之前的视图就成了deactive状态。
可以通过实现 IRegionMemberLifetime 并重写 KeepAlive 的 get 方法来自定义什么情况下销毁页面,使每次页面处于 deactivated 状态时 ViewModel 对象被销毁,再次导航到被销毁页面后重新创建新 ViewModel 对象。
  1. public class ViewBViewModel : BindableBase, INavigationAware, IRegionMemberLifetime
  2. {
  3.     public bool KeepAlive => false;
  4. // ...
复制代码
导航时携带参数
  1. private void PersonSelected(Person person)
  2. {
  3.     var parameters = new NavigationParameters();
  4.     parameters.Add("person", person);
  5.     if (person != null)
  6.         _regionManager.RequestNavigate("PersonDetailsRegion", "PersonDetail", parameters);
  7. }
复制代码
  1. public void OnNavigatedTo(NavigationContext navigationContext)
  2. {
  3.     var person = navigationContext.Parameters["person"] as Person;
  4.     if (person != null)
  5.         SelectedPerson = person;
  6. }
复制代码
TabControl与Prism导航

在 TabControl 中声明 RegionName ,在导航时会自动添加 TabPage。

引用


来源:https://www.cnblogs.com/bblitz/archive/2023/06/26/17502784.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具