Caliburn Micro 框架中Windows Phone 8使用研究(二)页面导航

背景

对于MVVM 架构的WP程序,一个很关键的问题就是导航,以及导航传参。有过经验的人很清楚WP导航只能在View中进行,并且导航参数也只能在NavigatedTo等View的事件中获取,如此我们便不得不在xaml.cs文件中加上处理,以获取导航参数然后再通过导航参数构造ViewModel。这个过程很痛苦,因为我们不得不再两个文件中来回切换来看我们的逻辑代码。

那么接下来我们看下CM作者的厉害之处(必须承认,真的很厉害),

让我们看下CM框架中导航是什么样子的:

不带参数的情况下:

在ViewModel中定义以下函数:

这两行涵盖的很多的信息,我们首先看下初次看到这几行时会存在的疑问:

1、navigatoinService是什么?

这个成员是如此定义的:

通过代码我们不难看出,这里通过依赖注入,MainPageViewModel会得到INavigationService接口类型的对象事例(CM采用容器进行对象的获取,上文提到我们在Bootstrapper里面定义了一个Container,此处不做展开,读者清楚通过此方式得到实例即可)。

2、UriFor是做什么的?

CM的页面导航是基于ViewModel的导航,自处我们调用UriFor<ActionPractisePageViewModel>,那么调用了UriFor之后,CM内部会自动定位到工程中定义的ActionPractisePage.xaml中(注意:此处定位基于命名协定,命名规则需匹配APage.xaml->APageViewModel)并自动构建出导航的Uri。

3、Navigate?

这个函数是导航执行的操作,找到ActionPractisePage.xaml后,便可导航到此页面,并且CM会根据命名协定通过Container再次得到ActionPractisePageViewModel,并将ViewModel自动Binding到View上。

4、其他呢?

事实上很神奇的一件事情就是,我们甚至可以删除ActionPractisePage.xaml.cs,因为CM内的导航执行后会自动调用ActionPractisePage的InitializeComponent()完成页面的构造工作。如此我们的工程目录看起来使这个样子:-)

5、难道只需要这一行代码么?

前面提到导航后会通过Container得到viewModel的一个事例,因此我们需要在Bootstrapper内配置ActionPractisePageViewModel:

看起来很不错,通过CM提供的导航我们可以在ViewModel中基于ViewModel进行定位并且导航。调用十分简洁,流畅接口让调用也十分容易,不易出错。

时间: 2024-08-28 12:43:30

Caliburn Micro 框架中Windows Phone 8使用研究(二)页面导航的相关文章

Caliburn Micro框架中Windows Phone 8 使用研究(一)简介

介绍 MVVM的出现给WPF Silverlight程序定义了程序的框架,MVVM可以解决业务层和UI层的耦合问题,更多优点不再赘述. 在WP手机端,很多工程也都采用MVVM进行架构,比较常见的工具集是MVVM Light Toolkit .它被应用在很多已知WP项目中,也有一些自己实现的MVVM架构工具多数也都基于此.而我们今天要说的是Caliburn Micro这个用于MVVM架构的Framework. 首先对比下MVVM Light Toolkit 和Caliburn Micro: 两者孰

Caliburn Micro 框架中Windows Phone 8使用研究(三)神奇的墓碑处理

背景 Windows Phone 8 开发过程中Tombstone的处理真是让我们又爱又恨,它能让程序看起来一直在运行.但处理墓碑却是个很麻烦的事情,传统的方式我们需要在程序Deactived事件触发后,将需要保存的状态放到State中,然后用户回来后再加载出来.而如果我们的程序采用MVVM架构,情况会更复杂,有多复杂相信每个人都有所体会.话不多说,让我们继续看CM框架中神奇的墓碑处理. 从简单的代码开始: 在测试页面,我们添加一个TextBox起名为Name: 然后在ViewModel中添加N

一起学Windows phone 7开发(二.页面间跳转与传值)

Windows Phone7允许创建多个页面,但并不像Windows mobile程序一样,可能关闭窗口或最小化,而是通过跳转的方式来实现的.但是其跳转方式也不同于PC上Sliverlight的跳转方式.不过其传值方式却是一样的. 一.跳转: 可以通过这条语句来完成:this.NavigationService.Naviagte(new Uri("/testPage.xaml", UriKind.Relative)); 向前跳转:this.NavigationService.GoFro

mfc windows编程-怎么才可以让mfc框架中显示出图片

问题描述 怎么才可以让mfc框架中显示出图片 如图所示,我看视频学的,写的也和视频中一样,可为什么图片总是显示不出来,是因为m_img没有赋值成功么,希望大神们指导,最好能写下源码.对了,我建立mfc.exe时,里面的什么头文件啊什么的,就加了一个Gdiplus.h,其他的什么定义也没动,只是加了一些东西,求教多谢各位大神 解决方案 http://blog.csdn.net/friendan/article/details/38358507http://blog.csdn.net/liu_che

《Windows 程序设计(第3版)》——第6章 框架中的窗口 6.1 CWnd类的引出

第6章 框架中的窗口 前面讲述了类库框架管理应用程序的基本方式,以及它的执行顺序.本章将继续介绍如何在框架程序执行的过程中创建窗口和响应线程内发送给窗口的消息. 消息处理是Win32应用程序的灵魂,也是本章重点讨论的话题.本章最终要设计一个能够实现消息映射的基本构架. 6.1 CWnd类的引出 在类的体系结构中,框架程序提供了CWnd类来封装窗口的HWND句柄,即使用CWnd类来管理窗口的对象,这包括窗口的创建和销毁.窗口的一般行为和窗口所接受的消息. 为了使其他的类也有处理消息的机会,我们可以

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记目录 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle IConductor  ,Conducto

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记目录 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specified context. /

在Python的Flask框架中实现单元测试的教程

  在Python的Flask框架中实现单元测试的教程,属于自动化部署的方面,可以给debug工作带来诸多便利,需要的朋友可以参考下 概要 在前面的章节里我们专注于在我们的小应用程序上一步步的添加功能上.到现在为止我们有了一个带有数据库的应用程序,可以注册用户,记录用户登陆退出日志以及查看修改配置文件. 在本节中,我们不为应用程序添加任何新功能,相反,我们要寻找一种方法来增加我们已写代码的稳定性,我们还将创建一个测试框架来帮助我们防止将来程序中出现的失败和回滚. 让我们来找bug 在上一章的结尾

如何在Python的Flask框架中实现全文搜索?

  这篇文章主要介绍了在Python的Flask框架中实现全文搜索功能,这个基本的web功能实现起来非常简单,需要的朋友可以参考下 全文检索引擎入门 灰常不幸的是,关系型数据库对全文检索的支持没有被标准化.不同的数据库通过它们自己的方式来实现全文检索,而且SQLAlchemy在全文检索上也没有提供一个好的抽象. 我们现在使用SQLite作为我们的数据库,所以我们可以绕开SQLAlchemy而使用SQLite提供的工具来创建一个全文检索索引.但这么做不怎么好,因为如果有一天我们换用别的数据库,那么