工作中之前接触过的WPF程序一直是使用TabControl作不同页面间的切换,每个Tab负责独立的功能,清晰简捷,所以一直就没有动力研究WPF自带的页面导航。(虽然接触过使用页面导航的WPF项目,也并没有去了解,而是似懂非懂地过去了。)

直到最近做的一个项目,用的还是TabControl,但在某个Tab里面,做的任务有些复杂,导致UI在操作前后会有很大的变化。很自然的想法就是在这个Tab中使用两个view(我并没有指明是UserControl还是Page),来回切换。然而粗略地调查了一下之后觉得实现起来有点麻烦,然后这个Tab也不是特别复杂,于是就硬着头皮使用了笨方法:把所有控件都画上去,后台的ViewModel用各种属性绑定控制各个控件的隐藏、显示、以及位置。

实现的效果很好,但终究是有些不踏实。于是最近趁着项目间歇,花时间看了一下WPF的页面导航,以下是学习总结。

1. WPF自带的页面导航

网上搜到了一篇WPF Navigation的博客,讲解地很到位。《WPF编程宝典》2010版的第24章内容差不多,也讲的很全面。

WPF的页面导航其实是微软在发明了Inductive User Interface 后引入的。据说用户往往觉得web应用要比桌面应用更好用,因此桌面应用着急了,就开始学web应用了。

WPF页面导航的几个关键组件:负责导航的NavigationService,可以导航的用户界面Page,以及最常用的导航容器Frame。在上文博客中还介绍了页面的生命周期,很有意思。还有更高级的PageFunction等等,很好很强大。再回头看看以前的那个使用导航的项目,觉得看懂了好多~

2. 不使用页面导航来实现页面跳转

然而有人表示不服。她是这样说的:“我一开始也被如何搞定页面导航弄糊涂了。不过,我坚信应该让ViewModel去做一切的工作,而View只是个漂亮的界面而已。我不想在界面上弄个按钮然后带段代码来切换页面。”

她想到了一个很漂亮的方案来实现页面跳转。分别在下面两个博客里。

第一篇博客说,你只需要在你的ViewModel里面加一个Property,叫CurrentView,然后根据情况为这个属性赋上不同的ViewModel。在主界面里,用一个ContentControl来绑定CurrentView。至于如何渲染界面,则采用DataTemplate!妙哉!

第二篇博客则补充了如何在application中加入一个ApplicationViewModel,来管理不同的ViewModel的切换。

最后她还推荐去看一下WPF的消息系统,如MVVM Light’s Messenger, 或 Microsoft Prism’s EventAggregator (to broadcast ChangePage commands from any ViewModel so you wouldn’t need to find the ApplicationViewModel to execute the ChangePageCommand, however that’s for another day

是啊,that's for another day... 改天吧~

WPF的页面导航的更多相关文章

  1. WPF MvvmLight简单实例(1) 页面导航

    原文:WPF MvvmLight简单实例(1) 页面导航 实现了那些功能,先看看截图: 操作描述: 在程序运行后,点击“Load”按钮,页面会加载PageOne,点击PageOne页面中的“Next” ...

  2. 浅谈WPF页间导航

    浅谈WPF页间导航 使用导航的目的是从一个页面进入到另一个页面.无论是预先决定的线性顺序(向导)还是基于层次的用户驱动程序(大部分网站的形式),或者动态生成的路径,主要有3种方法实现:调用Naviga ...

  3. wp8.1 页面返回 页面导航

    public The_second() public second() { this.InitializeComponent(); Frame frame = Window.Current.Conte ...

  4. Windows Phone 8.1 新特性 - 页面导航

    本篇介绍一下Windows Phone 8.1 中页面导航的实现方式. 大家对Windows Phone 8 中页面导航的实现一定不陌生,我们使用 NavigationService 来实现.具体写法 ...

  5. WinPhone学习笔记(一)——页面导航与页面相关

    最近学一下Windows Phone(接下来简称“WinPhone”)的开发,在很久很久前稍探究一下WinPhone中对一些传感器的开发,那么现在就从头来学学WinPhone的开发.先从WinPhon ...

  6. 【Win10】页面导航的实现

    注:本文基于 Windows 10 10240 及其 SDK 编写,若以后有变化,请以新版本为准. 页面导航我们是再熟悉不过了,浏览器.手机 App 大多都使用这种方式来展示内容.在 Windows ...

  7. wp8.1 Study1: 页面导航&页面间值传递

    摘要:wp8.1与wp8中很多API是不一样了,wp8.1把以前wp7.x时的api去掉了,更多与win8.1的API相似.比如以下的页面导航和页面之间的值传递 1.页面导航 利用Frame.Navi ...

  8. 与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏

    原文:与众不同 windows phone (27) - Feature(特性)之搜索的可扩展性, 程序的生命周期和页面的生命周期, 页面导航, 系统状态栏 [索引页][源码下载] 与众不同 wind ...

  9. windows phone 页面导航(6)

    原文:windows phone 页面导航(6) 页面导航的例子我们使用的是两个页面,从第一个页面(MainPage)导航到第二个页面(SecondPage),然后可以从第二个页面导航到第一个页面 , ...

随机推荐

  1. iOS开发UI篇--一个侧滑菜单SlidingMenu

    一.简介 侧滑菜单已经成为app一个极常用的设计,不管是事务类,效率类还是生活类app.侧滑菜单因Path 2.0和Facebook为开发者熟知,国内目前也有很多流行app用到了侧滑菜单,比如QQ.网 ...

  2. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  3. $_SERVER['DOCUMENT_ROOT']

    $_SERVER['DOCUMENT_ROOT'] 一.总结 $_SERVER 是一个包含了诸如头信息(header).路径(path).以及脚本位置(script locations)等等信息的数组 ...

  4. Latex表格制作记录

    Latex表格制作记录 主要功能 合并表格的行列 长表格的使用 makecell例程借鉴 效果图 参考代码 \documentclass{ctexart} \usepackage{indentfirs ...

  5. SDUT OJ 2862 勾股定理

    #include<iostream> using namespace std; int a[1010]; void qsort(int a[],int l,int r) { int x=a ...

  6. Nginx content cache Nginx内容缓存

    原文地址:http://nginx.com/resources/admin-guide/caching/ Nginx content cache Nginx内容缓存 This chapter desc ...

  7. Java中的日期操作 分类: B1_JAVA 2015-02-16 17:55 6014人阅读 评论(0) 收藏

    在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...

  8. js页面载入特效如何实现

    js页面载入特效如何实现 一.总结 一句话总结:可以加选择器(里面的字符串)作为参数,这样函数就可以针对不同选择器,就很棒了. 1.特效的原理是什么? 都是通过标签的位置和样式来实现特效的. 二.js ...

  9. stm32的DMA重新工作

    下面是在战舰V3寄存器程序例子中找到的: //开启一次DMA传输void MYDMA_Enable(DMA_Channel_TypeDef*DMA_CHx){    DMA_CHx->CCR&a ...

  10. iOS开发AFN使用二:AFN文件下载与文件上传

    #import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...