账户助手也可以成为账户Money管理系统。大家看到管理系统第一个想到的词汇是什么 是不是诸如“信息管理系统”、“数据库”之类的词语是的我们账户助手中需要使用数据库。由于目前的Windows Phone 中没有内置数据库的支持Mango更新会提供SQL-CE的支持 我们只能使用第三方提供的类库了。博客园的chenkai对Windows Phone 7 平台上数据库的使用做了一个很好的介绍。这儿我采用winphone7db.下图是winphone7db项目的截图它实现的方法是使用xml进行存储不知道大家对.Net 2.0中的DataTable和DataSet有没有什么印象我以前经常接触这两个东东其实他们也是基于XML的。下面我们来写一个简单的辅助类去操作winphone7db并利用Windows Phone 7 隔离存储空间资源管理器去查看我们存进去的数据长什么样的。然后我们在界面中放置一个按钮按钮的点击事件就是往数据库中插入数据大致代码如下运行后我们来看看应用程序隔离存储空间中多了些什么关于Windows Phone 7 隔离存储空间资源管理器可以参考我的博客右击AccountHelper.wp7Db.Model.Money 选择下载使用UltraEdit或者其他文本编辑器打开后会发现里面的内容其实是一个xml如下note: NULL is auto generated by isolatedstorage explorer...winphone7db测试项目源代码下载数据库有了接下来需要准备什么呢对了是程序框架那么windows phone 应用程序使用神马框架最好呢我的回答是MVVM Light....maybe it is different for you .二、MVVM知识准备2.1 MVVM简介MVVM的简介网上有很多资源我就不重复了。我把自己的一点理解拿出来跟大家分享。MVVM字母的全称想必大家都知道Model-View-ViewModel。我这里想要说明的一点就是MVVM一般是使用一个类去绑定整个页面的DataContext这个类将在页面构造函数调用前被实例化所以我们可以做一些初始化的事情...。2.2 MvvmLight简介MVVM的框架很多比如WPF最常用的Prism以及我们项目中用到的MvvmLight.The MVVM Light Toolkit is a set of components helping people to get started in the Model - View - ViewModel pattern in Silverlight and WPF. It is a light and pragmatic framework that contains only the essential components needed.MvvmLight是开源的项目我们可以查看其源代码而且MvvmLight是基于MIT协议的我们可以任意修改。并且MvvmLight提供了Visual Studio和Expression Blend的模板简化我们的开发。PSMvvmLight的源代码在其目录GalaSoft.MvvmLight (NET35)下2.3 MvvmLight之CommandCommand是WPF和Silverlight中的重要特性之一 但是在silverlight for windows phone 中对Command的支持并不友好所以我们需要借助现有的框架去实现Command。熟悉WPF和Silverlight的朋友应该都知道ICommand的重要用处MvvmLight中的Command也实现了这个接口。上图是MvvmLight中Command的初步实现方法可以看到有两个类一个普通Command一个泛型的Command。分别有CanExecute能否执行该命令通常用于限制命令执行的条件Execute执行该命令。RaiseCanExecuteChanged是否能执行命令的条件发生改变、RelayCommand构造函数。第三个类图是扩展的Button即往Button中附加Command及CommandParameter。附件属性是一门“可怕”的技术相当的神奇.这个类的用处是将事件转换为命令如果后面项目中用到再说。2.4 MvvmLight之Messenger大家用过MSN么MSN的全称其实就是Messenger。大家用MSN来做神马不是有QQ么。一位国外的朋友说道外国人一般都用MSN。Messenger在MvvmLight中的作用就是用于View和ViewModel中的通信的。有童鞋会问View和ViewModel不是通过数据绑定去沟通的么绑定不是万能的在某些时候绑定甚至会影响程序的性能因为直接的赋值肯定比通过绑定引擎去赋值更快捷。Messenger可以在View或者ViewModel中注册Register一个账号token以及对于的处理委托通常是对View或者ViewModel中的对象进行的操作,然后再ViewModel或者View中对其发送消息Send收到消息后委托中相应的代码就会执行。大家可以联想CS游戏中的定时炸弹我在你家里埋了个炸弹然后我可以使用遥控器控制炸弹是否爆炸....来看下其实现方法下图是Messenger的类结构图Messenger还有一个用处就是可以在ViewModel中使用MessageBox...PS我一开始真没理解为什么要用Messenger接触过几个用法以及看了下源代码中的注释后稍微有所了解。大家有兴趣可以看看源代码想想其中的道理。2.5 小结MvvmLight是一款轻量级的MvvmLight框架使用简单功能强大是居家旅行开发WP7必备良器。三、Expression Blend 知识准备Blend是界面处理的利器方便的生成XAML代码我整理了一份 Expression Blend 知识锦分享 大家可以参考一下。这里由于篇幅原因就略去对Expression Blend的使用介绍了。另外国外的牛人整理的Blend系列也是很好 大家可以去看看 http://www.kirupa.com/blend_wpf/index.htm四、需求分析与逻辑设计4.1需求分析在详细介绍如何去实现这个程序之前有必要介绍下为什么要实现账户助手即软件工程中的需求分析很重要的一点。我以前有记账本的习惯即自己花了多少钱花在那些地方。有个不错的软件记账本JZben做的非常不错。但是由于记性不是很好晚上可能就想不起来今天哪些地方花钱了或者前几天花了多少钱…因为程序是安装在电脑上的你可能只有某个时间才能操作它这就是为什么要在Windows Phone 上实现类似软件的原因了让你随时随地记录你资金资金貌似有点夸大了…的流向。由于是简单的记录所以我这里尽可能的简单化比如收支类型就只有收入和成本两种其实还有很多的情况如转账、借贷等等。ok需求分析简单确定了我们有必要做这个软件而且需求也不是很多稍微整理下1. 记录花在什么地方2. 随时随地记录这个已经Overwindows phone is always with you3. 能出个月总收入、月总支出、月合计的数字4. 如果能出个图表就更好了5. 简单易用漂亮大方这个可能是所以软件都要求这样的Okay我做的AccountHelper基本上就是按照上述需求来实现的。4.2 逻辑设计大部分程序员的主要任务其实就是将软件在逻辑上实现很多时候我们程序员处理的就是逻辑问题。所以我们在写代码前需要将逻辑弄清楚不然写的代码也是做无用功 以下是AccountHelper的大致流程图流程图有了那么在项目中我们选择哪些控件来呈现我们的数据呢或者说我们的页面大概有哪些呢具体见下图五、Coding在软件工程中Coding占的比例不大。但是在实际开发中很多人往往花70%-80%的时间在Coding上。大部分人认为自己可以一边设计一边编码而往往这种思想会让你事半功倍我记得我以前有说过一句话“劳力者下劳智者中劳人者上”。很多程序员虽然号称做的是脑力活动其实他们做的是劳力的工作。他们往往不愿意花时间在思考上而是花在动手上整个项目这儿看看那儿瞧瞧。看了一点后就认为懂了就想着照葫芦画瓢…哦Dear….我以前也有类似的想法我没吃过猪肉还没见过猪跑么…“给我一个Demo我能给你造10个类似的Demo”…..难怪山寨在国内这么流行….额扯远了。以上那段话的意思是让大家多多注重需求分析和逻辑设计的重要性如果你的逻辑错了软件还可以改正回来如果你的需求错了那软件大都只能推倒重来…okay下面进行Coding阶段我尽量以最简洁的语言将大致的编码过程讲明白如果不明白的可以微博上找我私聊哈哈.右上图看我们总共需要这些页面MainView首页SettingView设置页NewChargeView新建页以及ChartView图表页。下面咱们逐个攻克之.Note我只会介绍大致思路而不是详细的过程5.1 项目搭建如上图是主项目的大致框架我们将不同作用的类放在不同的命名空间下方便以后管理。主要的View同上的设计图。当然这里需要引入一些命名空间。如下图所示5.2 首页实现首页是一个全景视图控件有四个项菜单项、支出列表、收入列表和个人资料页。大致的效果如下图收入以及成本列表其实就是两个ListBox没什么难度只要大家数据绑定正确数据就能够正常显示唯一的区别就是你的ListBox漂亮程度P.S 美工不好列表不怎么漂亮嘿嘿。下面来看一下菜单项是如何实现的我们看到菜单项有6个菜单我这里采用绑定来实现即在ViewModel中初始化这些菜单并且这些菜单的Command都绑定的同一个那么我们如果区分用户点击的是哪个菜单呢?我们知道Command是可以传递参数的是的就是通过CommandParameter来实现的。下图是Panorama项目的XAML代码可以看到是利用一个现有的turnstile实现而这个turnstile是继承自ItemsControl的所以这些菜单其实就是一个个ItemsControl。他又一个模板TuenstileItemTemplate我们的绑定、Command都是写在模板中的前台XAML代码准备好了我们需要在相应的ViewModel中准备相应的属性从XAML中可以看到Menu的数据源是一个名为MenuList的东东。那这个东东是神马呢我们这里采用的是在MVVM中采用的集合ObservableCollection我们在ViewModel中实例化属性并给属性初始化下面的代码即是初始化菜单