一:缘起

  老板有做PC桌面客户端的需求,做的是能耗的计算和评估,要算能耗,就有很多环节,最后对这些环节数据进行一些简单计算。我想要是做的话就用比较熟的wpf,就去聊了下,对方给了1张比较复杂的Excel表格(其实对方的需求并不是很清楚,最后大概10来张EXcel表格),说是要做成软件呈现的形式,也没要求数据库,反正只要有功能,界面他们也没概念,给了个98年的老软件作为参考,最后EXcel表格弄懂结构后不复杂,计算都是加减乘除。我就答应了,这个软件算起来大概花了几个月(现在的样子我还是比较满意的),现在来回顾下。

  二:初步实施

  按着我的理解,我开始计划软件了,首先我没考虑数据库(也算是丧失了弄ADO.net的机会),他们的最后的PC环境千奇百怪,又要求尽量减少安装步骤,所以就没考虑数据库了,一开始面对40,50多个不同计算条目,我想要是每个都建类的话,绝对死,万一以后100,200,完全不可控。但是把这些当做实例来当时的想法是,这不好组织,是组织成字典?还是list?wpf的主要的binding该怎么做?这个也不好办。最后想到XML,事实证明Xml相当好用。在MVVM下,XML的xmlelement就是MVVM中的Model了。现在看来,XML,XPATH就是这个软件的最最核心了。

我把条目先全都录入Xml中,一开始感觉Linq to Xml比较好用,new 一个元素比较直观,就用了XElement,但在绑定过程中,不好选择属性,后来想到以前忽略的Xpath绑定属性,在看了一晚上Xpath用法后,才发现XPATH是个这么好用的工具,但是XElement元素没有对应的Xpath可以使用,(按理说应该有),最后还是选择了Xmlelemnt,主要靠SelectNodes,SelectSingleNode这两个XPATH方法。

  三:各个模块

  有了好的数据层,VM,V就比较好办了。一开始的软件像下面这样:

在GitHub找了Metro那个开源项目,我就使用了过来,一开始比较笨,对于4个大类,不是很多,我就一个一个建DataGrid就行了

在对每个DataGrid绑定一下XML,由于数据都是由用户更改,绑定是单向的,不需要Model实现INotifyPropertyChanged(Xmlelement也没有实现),在建立好DataGrid之后,我对他们要求中比较模糊的设备环节

做了一些假想,得到个右上角的奇怪的东西,也是用了一个开源的Xeed的wpftoolkit(不过最后这个模块放弃了)。然后是计算,计算的式子也是很古怪,牵扯的条目比较多,所以我就干脆把EXcel里的算式全都原封不动的放在我的XML里面,然后用正则替换掉算式里面的单元格编号。

最后使用比较解耦的计算过程,将计算的公式的string放入计算类,由计算类给出结果。

然后用了破解的WPFVisifire.Charts显示饼图和柱状图,虽然好用,但是用的破解的,不知道以后会不会有问题。

导出Excel结果的功能由另一个同学用NPOI来实现。

  四:需求基本得到确定,全面改进

  这个阶段才是真正知道了他们要的是什么。上面的软件少了很重要的一个环节:设备管理。  

他们要做的事不止是算能耗,还需要确认下哪个环节有哪些设备,相当于某个环节有他环节下对应的设备。设备有些参数重要有些参数不重要。

针对环节设备,设计了一张xml表,用以管理设备逻辑,设备管理页面重写一个listbox样式,treeview样式。下面是各个部分。

程序为所有XML文件设置单例的全局类,所有的操作都会对这个全局类中的数据成员有影响,最终也会保存到对应的XML文件。保证XML对象只new一次,所有操作通过强大的XPATH完成。

(每个工程有它自己的XML文件)

1.工程管理

工程的保存全都以XML形式。打开读取都是读XML。由于前台直接跟XML数据绑定,我要做的就是在程序退出的时候保存XML,大胆保存,因为这个XML已经由用户修改过了。

关于工程切换的问题,弄了我一整天,就是要在多个工程切换的时候加载自己工程的XML,但是前台只负责显示,而且我的前台自定义DataGrid是静态写在XAML里面的,一开始各个工程XML文件不能良好分开,试

了很多办法,遍历可视树等。后来还是通过为自定义的DataGrid设置依赖属性来解决的,在依赖属性变化的时候,用一个回调函数来为DataGrid改变绑定源。

2.设备管理

设备管理重写几个控件的样式,核心是TreeView和listbox,treeview样式是模仿微软示例demo的,作了些调整。listbox主要是用groupstyle。这部分数据也保存在单例的XML类中,这样数据填写完成后就已经得到了保存(通过binding),如果想在哪个页面用这些数据,传递一个xmlelement就可以了。

3.结果计算

这部分用了一个别人的四则计算模块,再用正则处理计算公式,用了个破解的visifire图表控件。最后用NPOI保存了EXCEL。

五.小结

这个项目在12月底就初步做完了,之所以一直没写,是忙学校比赛和开题的事。但是做个总结还是有必要的。

总结:做的时候多看msdn文档,多动手,多巩固基础。基础在解决多项目的问题时真是头痛死我了,后来还是想到依赖属性的回调函数来解决,解决得比较满意。

有个好的架构很重要,内存什么时候分配的要知道。

另附一个这个软件演示的答辩的PPT。

PPT有点大,加了三张GIF动态图片。

http://pan.baidu.com/s/1eQD0IOi

一个WPF小项目小结的更多相关文章

  1. Extjs6(一)——用sencha cmd建立一个ExtJs小项目

    本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] ...

  2. 创建第一个spirngmvc小项目

    题外: 设置目录为源代码目录 1.进入:file->project structure->modules->soures 进入这个里面,选择相应的文件夹.例如src/java里的ja ...

  3. 又见angular----步一步做一个angular4小项目

    这两天看了看angular4的文档,发现他和angular1.X的差别真的是太大了,官方给出的那个管理英雄的Demo是一个非常好的入门项目,这里给出一个管理个人计划的小项目,从头至尾一步一步讲解如何去 ...

  4. php小项目小结

    最近一直断更,并不是出于什么问题,而是想找个合适的机会去整理下html基本的一些琐碎的知识点 近期突发感冒,吊水,吊错药,原因只是重名重姓,这不是个梗,很是痛苦的现实事故 so,只能用剩下的半天去完成 ...

  5. scrapy的一个简单小项目

    使用scrapy抓取目标url下所有的课程名和价格,并将数据保存为json格式url=http://www.tanzhouedu.com/mall/course/initAllCourse 观察网页并 ...

  6. express+mongoDB(mLab)做一个todolist小项目

    这是在网课上学习的,先建立一个express-todolist文件夹作为项目跟目录 另外,我们直接把项目上用到的css文件和js文件下载下来放在项目里 这里直接贴出来 先建立一个public文件夹,放 ...

  7. 第一个Python小项目:图片转换成字符图片

    实现的效果:                                                                                               ...

  8. 今天写了一个SSM小项目,运行之后,前端页面的CSS、js样式显示不出来,具体操作如下:

    因为SSM中我们设置了拦截器,拦截器会拦截CSS和JS,所有样式渲染不出来,在Web.xml中写上 1 <servlet-mapping> 2 <servlet-name>de ...

  9. Web前端开发:SQL Jsp小项目(一)

    Jsp的学习算是告一段落,针对这段时间的学习,写了一个Jsp小项目来巩固学到的知识. 框架示意图 User list process UserAdd process 需要的界面效果: 需要工具:Ecl ...

随机推荐

  1. Mysql(Linux服务器)root用户密码忘记重置方法

    MySQL是非常常见的开源数据库,使用者众多,若是不小心忘记了安装在服务器的mysql密码,无法登陆,应该如何重置呢?方法很简单,现在和大家分享下.(系统环境:CentOs 6.5  软件:Mysql ...

  2. 2019年GPLT L2-4 彩虹瓶 比赛题解 中国高校计算机大赛-团体程序设计天梯赛题解

    彩虹瓶的制作过程(并不)是这样的:先把一大批空瓶铺放在装填场地上,然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里. 假设彩虹瓶里要按顺序装 N 种颜色的小球(不妨将顺序就编号为 1 到 N).现 ...

  3. C++基础学习5:强制类型转换

    在C++语言中新增了四个关键字static_cast.const_cast.reinterpret_cast和dynamic_cast.这四个关键字都是用于强制类型转换的.我们逐一来介绍这四个关键字. ...

  4. NSArray,NSMutable和NSSet,NSMutableSet和NSDictionary,NSMutableDictionary用法

    开始编写应用程序的代码时,可以利用大量的 Objective-C 框架.其中,为所有应用程序提供基本服务的 Foundation 框架尤为重要.Foundation 框架包括表示基本数据类型的值类(如 ...

  5. iOS开发小工具

    基本上在Mac Appstore里面都有,很多是免费的.因为某种原因要重装Mac系统(这么多年来首次重装Mac系统),特意整理了下备忘. 1.AppIcon: 可以瞬间把图片转换为应用所需要的Icon ...

  6. CF709A Juicer 模拟

    Kolya is going to make fresh orange juice. He has n oranges of sizes a1, a2, ..., an. Kolya will put ...

  7. PHP 实现实现多线程

    前言 前些天帮同事查一个问题,第一次接触到了 PHP 的多线程,原以为 PHP 普遍都是单线程模型,并不适合多线程领域,花些时间翻了几个多线程的项目源码之后,发现 PHP 的多线程也颇有可取之处,活用 ...

  8. php暂停函数sleep()和usleep的区别

    在PHP中暂停代码执行一定时间,有两个函数可以实现,一个是sleep(),另一个是usleep(),它们参数都是一个整数值.sleep()是暂停多少秒,usleep()是暂停多少微秒. 注意:usle ...

  9. 关于AppiumDriver

    java client2.0之后把AppiumDriver作为抽象类,IOSDriver和AndroidDriver继承AppiumDriver.安卓端就用AndroidDriver.2.0之前And ...

  10. navicat data modeler的使用以及数据库设计的流程

    E-R图(Entity Relationship Diagram) 又称实体-联系图 (提供了表示实体类型.属性和联系的方法,用来描述现实世界的概念模型) 构成E-R图的3个基本要素是实体型.属性和联 ...