05Prism WPF 入门实战 - Navigation

1.概要

源码及PPT地址:https://github.com/JusterZhu/wemail

视频地址:https://www.bilibili.com/video/BV1KQ4y1C7tg?share\source=copy\web

本章分为以下三个部分来了解:

Part1 视图导航、参数传递

Part2 确认导航

Part3 导航日志

2.详细内容

Part1 视图导航、参数传递

当用户与丰富的客户端应用程序交互时,其用户界面 (UI) 将不断更新,以反映用户正在处理的当前任务和数据。随着时间的推移,随着用户与应用程序内的交互并完成各种任务,UI 可能会发生相当大的变化。应用程序协调这些 UI 更改的过程通常称为导航,这一过程由INavigationAware做支撑。

应用场景:View之间传值、需要在导航过程做操作(例如及时释放资源)。

e8b35147fdaf76bd36af316a5bb1ec2c.png

public class ContactViewModel : BindableBase , INavigationAware{private ObservableCollection<string> _contacts;private string _message;public string Message{get { return _message; }set { SetProperty(ref _message, value); }}public ObservableCollection<string> Contacts { get => _contacts ?? (_contacts = new ObservableCollection<string>()); }public ContactViewModel(){Message = "Wemail.Contact Prism Module";Contacts.Add("联系人张某");Contacts.Add("联系人王某");}public void OnNavigatedTo(NavigationContext navigationContext){var parameter = navigationContext.Parameters["Contact"];if (parameter == null) return;//导航到当前页面前, 此处可以传递过来的参数以及是否允许导航等动作的控制Debug.WriteLine(parameter.ToString() + "To Contact View.");}public bool IsNavigationTarget(NavigationContext navigationContext){//根据业务需要调整该视图,是否创建新示例。为true的时候表示不创建新实例,页面还是之前的;return true;}public void OnNavigatedFrom(NavigationContext navigationContext){//导航离开当前页面前。Debug.WriteLine("Leave Contact View.");}}

8282d3ef750e94e59c7ac1e9a92afa72.png

Part2 确认导航

您经常会发现您需要在导航操作期间与用户进行交互,以便用户可以确认或取消它。例如,在许多应用程序中,用户可能会尝试在输入或编辑数据时进行导航。在这些情况下,您可能需要询问用户是否希望保存或丢弃在继续从页面中导航之前已输入的数据,或者用户是否希望完全取消导航操作。这些特性由IConfirmNavigationRequest做支撑,它融入了AOP(面向切面编程)的思想。

应用场景:权限管理、检测用户行为(页面停留多久、哪个模块访问次数最多等)、日志记录等。

320f2946792af8e936ee2044380133bc.png

public class TempViewAViewModel : IConfirmNavigationRequest{public void ConfirmNavigationRequest(NavigationContext navigationContext, Action<bool> continuationCallback){bool result = true;// this is demo code only and not suitable for production. It is generally// poor practice to reference your UI in the view model. Use the Prism// IDialogService to help with this.if (MessageBox.Show("Do you to navigate?", "Navigate?", MessageBoxButton.YesNo) == MessageBoxResult.No)result = false;continuationCallback(result);}public bool IsNavigationTarget(NavigationContext navigationContext){//是否创建新示例。为true的时候表示不创建新示例,页面还是之前的;如果为false,则创建新的页面。return true;}public void OnNavigatedFrom(NavigationContext navigationContext){//导航离开当前页面前。}public void OnNavigatedTo(NavigationContext navigationContext){//导航到当前页面前, 此处可以传递过来的参数以及是否允许导航等动作的控制。}}

5fe2c3daf30658f7dece2a17a7eda631.png

Part3 导航日志

导航日志其实就是对导航系统的一个管理功能,理论上来说,我们应该知道我们上一步导航的位置、以及下一步导航的位置,包括我们导航的历史记录。以便于我们使用导航对应用程序可以灵活的控制。类似于我们熟知的双向链表结构。导航日志由IRegionNavigationJournal提供支撑。

IRegionNavigationJournal接口有如下功能:

GoBack() : 返回上一页

CanGoBack: 是否可以返回上一页

GoForward(): 返回后一页

CanGoForward: 是否可以返回后一页

71431c4d4f1388576c33223276981154.png

public class MainWindowViewModel : BindableBase{private string _title = "Prism Application";//Region管理对象private IRegionManager _regionManager;private IModuleCatalog _moduleCatalog;private ObservableCollection<IModuleInfo> _modules;private DelegateCommand _loadModulesCommand;private DelegateCommand _openViewA;private DelegateCommand _openViewB;private DelegateCommand _goBackView;private DelegateCommand _goForwardView;private IModuleInfo _moduleInfo;//导航日志private IRegionNavigationJournal _navigationJournal;public IView View { get; set; }public string Title{get { return _title; }set { SetProperty(ref _title, value); }}public ObservableCollection<IModuleInfo> Modules{get => _modules ?? (_modules = new ObservableCollection<IModuleInfo>());}public DelegateCommand LoadModulesCommand { get => _loadModulesCommand = new DelegateCommand(InitModules); }public IModuleInfo ModuleInfo { get {return _moduleInfo; }set {_moduleInfo = value;Navigate(value);}}public DelegateCommand OpenViewA { get => _openViewA ?? (_openViewA = new DelegateCommand(OpenViewAAction));}public DelegateCommand OpenViewB{get => _openViewB ?? (_openViewB = new DelegateCommand(OpenViewBAction)); }public DelegateCommand GoBackView { get => _goBackView ?? (_goBackView = new DelegateCommand(GoBackViewAction)); }public DelegateCommand GoForwardView { get => _goForwardView ?? (_goForwardView = new DelegateCommand(GoForwardViewAction)); }public MainWindowViewModel(IRegionManager regionManager, IModuleCatalog moduleCatalog){_regionManager = regionManager;_moduleCatalog = moduleCatalog;}private void OpenViewAAction(){//_regionManager.RequestNavigate("ContentRegion", "TempViewA");_regionManager.RequestNavigate("ContentRegion", "TempViewA",arg=> {//记录导航日志上下文_navigationJournal = arg.Context.NavigationService.Journal;});}private void OpenViewBAction(){//_regionManager.RequestNavigate("ContentRegion", "TempViewB");_regionManager.RequestNavigate("ContentRegion", "TempViewB", arg =>{//记录导航日志上下文_navigationJournal = arg.Context.NavigationService.Journal;});}/// <summary>/// 导航日志:导航到上一个/// </summary>private void GoBackViewAction(){if (_navigationJournal.CanGoBack){_navigationJournal.GoBack();}}/// <summary>/// 导航日志:导航到下一个/// </summary>private void GoForwardViewAction(){if (_navigationJournal.CanGoForward){_navigationJournal.GoForward();}}public void InitModules() {var dirModuleCatalog = _moduleCatalog as DirectoryModuleCatalog;Modules.AddRange(dirModuleCatalog.Modules);}private void Navigate(IModuleInfo info) {var paramete = new NavigationParameters();//任意定义key,value。导航到的视图按照约定key获取value即可。paramete.Add($"{ info.ModuleName }", DateTime.Now.ToString());_regionManager.RequestNavigate("ContentRegion", $"{ info.ModuleName }View", paramete);}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295624.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

明明没PS,看起来却像PS过的32张照片

全世界只有3.14 % 的人关注了爆炸吧知识现在PS太普遍&#xff0c;以至于人们看到不同寻常的东西&#xff0c;第一时间会怀疑经过技术处理。但也有一些照片&#xff0c;真的没有PS过&#xff01;1、这些轮胎痕迹令人产生了3D的错觉&#xff1a;2、截然分开的几种景观&#xff0c…

没有什么是日本牛郎店做不到的......

1 第一眼你看见了啥&#xff1f;▼2 确实很悲伤&#xff08;dy&#xff1a;李逍遥&#xff09;▼3 貌似真是这样▼4 我不爱打麻将咋办&#xff1f;▼5 短短十几个字&#xff0c;满满的江湖纷争▼6 少了男主的朋友不要轻易尝试▼7 哦吼▼8 双十一如你所愿&#xff0c;哈哈…

持续集成、持续交付(CI/CD)开篇,先来唠唠嗑

前言现在稍微有点规模的系统&#xff0c;很多都是采用分布式/微服务架构&#xff0c;将一个大系统拆分为很多个功能模块进行开发、测试、发布、管理等&#xff0c;如果全部流程都采用人工的形式进行的话&#xff0c;效率肯定是超级不高效滴。而且现在很多项目都采用极限编程的模…

100例经典炒菜_Python3经典100例(②)

实例6题目&#xff1a;斐波那契数列&#xff1b;分析&#xff1a;利用递归计算斐波那契数列&#xff0c;输入斐波那契数列的n位&#xff0c;调用递归计算出第n位的数列值&#xff1b;代码&#xff1a;#!/usr/bin/python3 # -*- coding: utf-8 -*- # Time : 2018-10-3 21:10 …

分享10个2012年最新发布的jQuery插件

为什么80%的码农都做不了架构师&#xff1f;>>> 日期&#xff1a;2012-5-9 来源&#xff1a;GBin1.com 本文收集了最新的jQuery社区发布的jQuery插件&#xff0c;绝对是你没有见过的&#xff0c;希望大家喜欢&#xff01; 1. SearchMeme 一个即时搜索的jQuery插件…

博士毕业的人也会交“智商税”?现实远比我们想象的残酷……

全世界只有3.14 % 的人关注了爆炸吧知识2018 年的那个多事之秋&#xff0c;我终于在人生快要过半的时候拿到了博士学位。大毛和小鱼是我博士期间玩得最好的兄弟&#xff0c;我们三人水平差不多&#xff0c;志向差不多&#xff0c;博士毕业后都进了双非高校。现实不像是想象中那…

聊一聊声明式接口调用与Nacos的结合使用

背景 对于公司内部的 API 接口&#xff0c;在引入注册中心之后&#xff0c;免不了会用上服务发现这个东西。现在比较流行的接口调用方式应该是基于声明式接口的调用&#xff0c;它使得开发变得更加简化和快捷。.NET 在声明式接口调用这一块&#xff0c;有 WebApiClient 和 Refi…

三次握手和四次挥手图解_三次握手和四次挥手简单理解

TCP三次握手TCP标志位TCP在其协议头中使用大量的标志位或者说1位&#xff08;bit&#xff09;布尔域来控制连接状态&#xff0c;一个包中有可以设置多个标志位。TCP是主机对主机层的传输控制协议&#xff0c;提供可靠的连接服务&#xff0c;采用三次握手确认建立一个连接&#…

Android之基于BaseAdapter和SimpleAdapter的GridView

GridView 第一种方式:用SimpleAdapter 先来贴出本文代码运行的结果: 本文需要添加/修改3个文件:main.xml、night_item.xml、JAVA源代码。 main.xml源代码如下,本身是个GirdView,用于装载Item: <?xml version="1.0" encoding="utf-8"?> <…

IOS开发CAKeyframeAnimation的基本使用与keypath的列举

2019独角兽企业重金招聘Python工程师标准>>> CAKeyframeAnimation跟CABasicAnimation的区别是&#xff1a;CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue)&#xff0c;而CAKeyframeAnimation会使用一个NSArray保存这些数值 - (void)value {CAKe…

少女为什么会身上香香的?

1 一旦接受这个设定苏打窃瓦辛格&#xff08;via.煎甜担担面&#xff09;▼2 有被冒犯到▼3 哈哈哈哈哈▼4 就差了难忘今宵▼5 还是挺在理的▼6 欣慰中带着点点悲伤▼7 原来是你的错▼8 哈哈哈哈哈▼你点的每个赞&#xff0c;我都认真当成了喜欢

Android之Android Studio三种方式导入外部资源 以及 报错处理

Android Studio三种方式导入外部资源 以及 报错处理 android studio提供了三种方式导入外部资源: 1. Library dependency – 在线添加、需联网下载 、 2. File dependency – 从本地添加一些jar包(要先将jar包</

android飞翔的小鸟游戏素材包_开心消消乐×愤怒的小鸟:为开心而战

手机里总有那么一些游戏&#xff0c;是你一旦不小心打开&#xff0c;就完全停不下来的。在这份“一直玩一直爽游戏清单”里&#xff0c;绝对少不了开心消消乐和愤怒的小鸟的身影。神奇的是&#xff0c;在2020的夏天&#xff0c;它们合体了&#xff01;在接到开心消消乐的brief时…

RabbitMQ 处理过慢,原来是一个 SQL 缓存框架导致的 GC 频繁触发

一&#xff1a;背景 1. 讲故事上个月底&#xff0c;有位朋友微信找到我&#xff0c;说他的程序 多线程处理 RabbitMQ 时过慢&#xff0c;帮忙分析下什么原因&#xff0c;截图如下&#xff1a;这问题抛出来&#xff0c;有点懵逼&#xff0c;没说CPU爆高&#xff0c;也没说内存泄…

3部世界顶级宇宙纪录片,献给对宇宙万物充满好奇的你~

全世界只有3.14 % 的人关注了爆炸吧知识宇宙深邃美丽&#xff0c;是黑夜的荧光&#xff0c;是夏天里冒着凉气的西瓜&#xff0c;总是诱人地勾起一代又一代人探索的欲望。对于宇宙思索与探索&#xff0c;人类的脚步从未停止。正是人类对宇宙的好奇&#xff0c;撑起了人类发展的大…

二元函数偏导数公式_偏导数计算公式大全

如果函数f(x)在(a,b)中每一点处都可导,则称f(x)在(a,b)上可导,则可建立f(x)的导函数,简称导数。以下是小学生作文网小编给大家提供的导数公式大全,快来看看吧!导数的定义:当自变量的增量... 2018-12-29 阅读全文 >> 导数公式大全-偏导数基本公式大全_营销/活动策划_计…

OC类

2019独角兽企业重金招聘Python工程师标准>>> OC语言的一个类分为两个文件一个.h&#xff0c;一个.m&#xff0c;.h为头文件用来添加实例变量和方法声明。.m文件里面写入方法的实现 .h一般如下 interface 类名:父类 属性声明 方法声明 end .m一般如下 implementation…

06Prism WPF 入门实战 - Log控件库

1.概要源码及PPT地址&#xff1a;https://github.com/JusterZhu/wemail视频地址&#xff1a;https://www.bilibili.com/video/BV1KQ4y1C7tg?share\sourcecopy\web本章分为以下几个部分来了解&#xff1a;Part1 日志Part1.1 全局异常捕捉Part1.2 DumpPart2 引入控件库2.详细内容…

天冷打字全靠抖?!桌面暖手宝,体验10s速热,温暖升级,冬天有TA就够了

▲点击查看没有一丝丝防备&#xff0c;冷空气说来就来了~无论是寒风猛烈的北方&#xff0c;还是湿冷又没有暖气的南方&#xff0c;对于上班族来说&#xff0c;冬天最痛苦的事情莫过于哆哆嗦嗦在工位码字了&#xff01;冷风侵袭无处不在&#xff0c;备上个暖手袋&#xff0c;根本…

设计模式-Factory Method Pattern

为什么80%的码农都做不了架构师&#xff1f;>>> 一、 工厂方法&#xff08;Factory Method&#xff09;模式 工厂方法&#xff08;FactoryMethod&#xff09;模式是类的创建模式&#xff0c;其用意是定义一个创建产品对象的工厂接口&#xff0c;将实际创建工作推迟…