zoukankan      html  css  js  c++  java
  • Prism之导航(Navigation)

    一、注册导航

    1、注册视图或起别名

    public class ModuleAProfile : IModule
        {
            public void OnInitialized(IContainerProvider containerProvider)
            {
            }
    
            public void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.RegisterForNavigation<ViewA>();
                //注册时指定ViewMode
                //containerRegistry.RegisterForNavigation<ViewA>("ViewAVM");
            }
        }
    

    2、注册时指定ViewMode并指定别名

    public class ModuleAProfile : IModule
        {
            public void OnInitialized(IContainerProvider containerProvider)
            {
            }
    
            public void RegisterTypes(IContainerRegistry containerRegistry)
            {
                containerRegistry.RegisterForNavigation<ViewA,ViewAViewModel>();
                //注册时指定ViewMode并指定别名
                //containerRegistry.RegisterForNavigation<ViewA, ViewAViewModel>("ViewAVM");
            }
        }
    

    二、使用导航

    IRegionManager regionManager = …;
    regionManager.RequestNavigate("RegionName", "ViewName");
    

    可以注意点, 我们调用了IRegionManager接口的RequestNavigate方法, 并且传递了两个参数:

    • RegionName: 该参数为注册的区域名称
    • ViewName: 该参数实际为我们上面注册过的导航页, 字符串类型, 对应的是我们注册页面的nameof

    三、带参数导航

    1、通过F12查看RequestNavigate,可以发现可以传递一个NavigationParameters进去,它是一个键值对的集合

    image-20210817220754140

    NavigationParameters pairs = new NavigationParameters();
                pairs.Add("Keys1", "Hello Prism!");
            _regionManage.Regions["ModuleContent"].RequestNavigate(obj,pairs);
    

    2、接着在VM中继承INavigationAware并实现

    image-20210817221006492

    3、在OnNavigatedTo方法中NavigationContext获取到所传递的参数,通过属性保存并绑定到视图中

    public void OnNavigatedTo(NavigationContext navigationContext)
            {
                if (navigationContext.Parameters.ContainsKey("Keys1"))
                {
                    Content = navigationContext.Parameters.GetValue<string>("Keys1");
                }
                
            }
    
    • OnNavigatedTo: 导航完成前, 此处可以传递过来的参数以及是否允许导航等动作的控制。
    • IsNavigationTarget: 调用以确定此实例是否可以处理导航请求。否则新建实例
    • OnNavigatedFrom: 用于拦截导航,当导航离开当前页时, 类似打开A, 再打开B时, 该方法被触发。
    INavigationAware 执行流程

    img

    拦截导航请求如果需要更多的功能则可以继承IConfirmNavigationRequest,通过F12发现它派生于INavigationAware,并且有一个自己独有的方法ConfirmNavigationRequest

    image-20210817222921444

    public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
            {
                bool result = true;
    
                if (MessageBox.Show("确认是否要离开当前模块?","系统提示",MessageBoxButton.YesNo)==MessageBoxResult.No)
                {
                    result = false;
                }
    
                continuationCallback(result);
            }
    

    效果:

    3

    四、上一步/下一步

    1、F12查看RequestNavigate,重载方法中有一个参数为Action

    image-20210817224544524

    我们稍微改一下

    2、声明一个IRegionNavigationJournal

     private  IRegionNavigationJournal journal;
    

    3、在RequestNavigate中加一个Callback参数,获取返回结果,通过这个navigationCallback的上下文中的导航服务获取到Journal并赋值给刚声明的IRegionNavigationJournal

    regionManage.Regions["ModuleContent"].RequestNavigate(obj, navigationCallback =>
                {
                    if ((bool)navigationCallback.Result)
                    {
                        journal = navigationCallback.Context.NavigationService.Journal;
                    }
                }, pairs);
    

    4、创建两个用于导航的按钮命令

    public DelegateCommand BackCommand { get; private set; }
    public DelegateCommand NextCommand { get; private set; }
    
    public MainWindowViewModel(IRegionManager regionManager)
            {
                _regionManage = regionManager;
                OpenCommand = new DelegateCommand<string>(OpenMethod);
                BackCommand = new DelegateCommand(Back);
                NextCommand = new DelegateCommand(Next);
            }
    

    5、通过Journal即可调用导航

     private void Back()
            {
                if (journal.CanGoBack)
                {
                    journal.GoBack();
                }
            }
    

    image-20210817225026070

    效果:

    4

    示例代码:https://github.com/luchong0813/PrismLearning

  • 相关阅读:
    FJoi2017 1月21日模拟赛 comparison(平衡树+thita重构)
    juruo的刷题&博文祭
    [bzoj4247][挂饰] (动规+排序)
    FJoi2017 1月20日模拟赛 直线斯坦纳树(暴力+最小生成树+骗分+人工构造+随机乱搞)
    FJoi2017 1月20日模拟赛 交错和(等差数列+rmq)
    FJoi2017 1月20日模拟赛 恐狼后卫(口糊动规)
    【spoj 5971】lcmsum
    【bzoj 4025 改编版】graph
    【CF 718C】fibonacci
    【CF 482E】ELCA
  • 原文地址:https://www.cnblogs.com/chonglu/p/15154711.html
Copyright © 2011-2022 走看看