WPF Prism框架之导航(Navigation)

注册

将UserControl通过RegisterForNavigation方法注册为Navigation

        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
            containerRegistry.RegisterForNavigation<ViewA>();
            containerRegistry.RegisterForNavigation<ViewB>();
        }

导航视图

通过IRegionManager.RequestNavigate进行视图导航的切换
1、简单导航

        IRegionManager _regionManager;
        IRegionNavigationService _regionNavigationService;

        public NavigationWindowViewModel(IRegionManager regionManager, IRegionNavigationService regionNavigationService)
        {
            _regionManager = regionManager;
            _regionNavigationService = regionNavigationService;
        }
        
        private DelegateCommand _viewBCommand;

        public DelegateCommand ViewBCommand
        {
            get
            {
                if (_viewBCommand == null)
                    _viewBCommand = new DelegateCommand(() =>
                    {
                        // 导航到 ViewB
                        _regionManager.RequestNavigate("ContentRegion", "ViewB");
                    });
                ;
                return _viewBCommand;
            }
            set { _viewBCommand = value; }
        }

2、导航传参

  • NavigationParameters:导航时传递参数
  • Action< NavigationResult >:导航结束时的回调(导航的最后执行)
        private DelegateCommand<string> _viewACommand;

        public DelegateCommand<string> ViewACommand
        {
            get
            {
                if (_viewACommand == null)
                    _viewACommand = new DelegateCommand<string>((view) =>
                    {
                        // 导航到 ViewA
                        // NavigationParameters 传值
                        NavigationParameters param = new NavigationParameters();
                        param.Add("value", "123");
                        _regionManager.RequestNavigate("ContentRegion", "ViewB",
                            new Action<NavigationResult>((result) =>
                            {

                            }),
                            param);
                    });
                ;
                return _viewACommand;
            }
            set { _viewACommand = value; }
        }

INavigationAware

在这里插入图片描述

  • IsNavigationTarget:控件View是重现(返回True)还是新建(返回False)
  • OnNavigatedTo:获取导航传值、导航的日志记录(可前进或者后退)
  • OnNavigatedFrom:触发时机不好阐述,最好调试看看
    public class ViewAViewModel : BindableBase, INavigationAware, IConfirmNavigationRequest
    {
        /// <summary>
        /// </summary>
        /// <param name="navigationContext"></param>
        public void OnNavigatedTo(NavigationContext navigationContext)
        {
            // 导航传值
            var param = navigationContext.Parameters["value"];

            // 历史记录
            _journal = navigationContext.NavigationService.Journal;
            //_journal.GoForward();
            //_journal.GoBack();
        }

        public bool IsNavigationTarget(NavigationContext navigationContext)
        {
            // 控件View是重现(返回True)还是新建(返回False)
            return true;
        }

        public void OnNavigatedFrom(NavigationContext navigationContext)
        {
            // navigationContext可以拿ViewA和ViewB两个对象
            // 触发时机
        }
   }

IConfirmNavigationRequest

在这里插入图片描述
导航某个页面,添加判断,是否是可以导航过去

    public class ViewAViewModel : BindableBase, INavigationAware, IConfirmNavigationRequest
    {
        // ===============================================IConfirmNavigationRequest
        public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback)
        {
            bool result = false;
            if (MessageBox.Show("数据没保存,是否离开", "确认", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
            {
                // 允许导航
                result = true;
            }
            // 判断是否允许导航
            continuationCallback(result);
        }
   }

IRegionNavigationService和IRegionNavigationJournal

_regionManager.Regions[“ContentRegion”].NavigationService可以获得IRegionNavigationService对象;
IRegionNavigationService.Journal可以获得IRegionNavigationJournal对象;

        private DelegateCommand _forwordCommand;
        public DelegateCommand ForwordCommand
        {
            get
            {
                if (_forwordCommand == null)
                    _forwordCommand = new DelegateCommand(() =>
                    {
                        var j = _regionManager.Regions["ContentRegion"].NavigationService.Journal;
                        if (j.CanGoForward)
                            j.GoForward();
                    });
                return _forwordCommand;
            }
            set { _forwordCommand = value; }
        }
        
        private DelegateCommand _backCommand;
        public DelegateCommand BackCommand
        {
            get
            {
                if (_backCommand == null)
                    _backCommand = new DelegateCommand(() =>
                    {
                        //var j = _regionNavigationService.Journal;
                        var j = _regionManager.Regions["ContentRegion"].NavigationService.Journal;
                        if (j.CanGoBack)
                            j.GoBack();
                    });
                return _backCommand;
            }
            set { _backCommand = value; }
        }
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF Prism框架是一个面向对象的框架,用于开发模块化、可扩展的WPF应用程序,它基于MVVM设计模式和依赖注入技术。该框架的主要目的是能够轻松地实现可插拔的模块,公共的服务、组件和工具类的共享,同时也提供了灵活的路由、事件聚合、模块加载、导航和命令处理等机制。使用WPF Prism框架可以快速地开发出灵活的WPF应用程序,从而提高代码质量和开发效率,减少代码的维护难度。 WPF Prism框架具有以下的特点: 1. 扩展性:可以轻松地添加新的模块、服务和组件,同时也可以快速替换现有的组件。 2. 可重用性:提供了丰富的公共组件、服务和工具类,从而可以提高代码的可重用性。 3. 灵活性:提供了灵活的路由、事件聚合、模块加载和导航等机制,能够更好地满足应用程序的需求。 4. 易用性:提供了一套完整的MVVM设计模式和依赖注入技术的实践方案,从而能够更好地组织应用程序的逻辑。 总之,WPF Prism框架是一个强大的工具,能够让我们更好地开发WPF应用程序,提高代码质量和开发效率,实现可插拔的模块化和可扩展性,同时也具有灵活性和易用性。 ### 回答2: WPF Prism框架是一种面向MVVM模式的开源框架,它帮助开发人员使用模块化的方式构建可扩展、可重用和易于维护的WPF应用程序。该框架主要由Microsoft和模式仲裁者团队开发和维护,它借鉴了许多现代的软件开发理念,比如IoC容器、依赖注入和事件聚合器等。 WPF Prism框架的核心思想是将应用程序分解为许多可独立维护和扩展的模块。这些模块可以基于业务逻辑、UI、数据或任何其他特征进行分组。在该框架中,模块由各种名为“组件”的构建块组成。这些组件包括视图(View)、视图模型(ViewModel)、服务(Service)、模型(Model)等。通过基于这些组件的开发,可以实现具有高度可伸缩性和可重用性的应用程序。 为了实现这种模块化开发和组件化架构,WPF Prism框架提供了一些重要的工具和特性。例如,在该框架中可以使用依赖注入容器(如Unity)来管理组件及其依赖关系。此外,该框架还提供了一些基于事件的消息机制,可方便地实现模块间的交互和通信。 总体来说,WPF Prism框架是一种利用开源技术实现企业级应用程序开发的最佳选择。它具有良好的模块化、组件化和可扩展性特性,可以在实现复杂WPF应用程序时提高开发效率和代码质量。 ### 回答3: WPF Prism是一个基于WPF框架,它为大型应用程序提供了一种组织、设计和部署的方式。它旨在帮助开发者构建可扩展、可维护和可测试的WPF应用程序。 WPF Prism采用了面向模块的编程思想,它将整个应用程序划分为多个模块,每个模块都包含自己的逻辑和用户界面。这种模块化设计使得应用程序易于扩展和维护,同时也简化了开发流程。 WPF Prism同时提供了一组强大的工具和功能,如依赖注入、命令模式和事件聚合等,这些功能让WPF应用程序更加易于开发和测试。它还提供了一个强大的导航和区域管理系统,开发者可以使用这些系统来管理不同部分的用户界面和功能。 总之,WPF Prism是一个优秀的框架,它为开发者提供了全面的工具和功能,使得构建WPF应用程序变得更加容易和高效。它的结构良好、可扩展性强,而且可以充分利用WPF的强大功能。无论是大型企业应用程序还是小型桌面应用程序,WPF Prism都是一个理想的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值