一:缘起

  老板有做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. Binder学习笔记(十一)—— 智能指针

    轻量级指针 Binder的学习历程爬到驱动的半山腰明显感觉越来越陡峭,停下业务层的学习,补补基础层知识吧,这首当其冲的就是智能指针了,智能指针的影子在Android源码中随处可见.打开framewor ...

  2. Installing the .NET Framework 3.5 on Windows 8, Windows 8.1 and Windows 10

    Installing the .NET Framework 3.5 on Windows 8, Windows 8.1 and Windows 10 .NET Framework (current v ...

  3. weekly contest 115

    958. Check Completeness of a Binary Tree Given a binary tree, determine if it is a complete binary t ...

  4. 区块链中的密码学(二)-RSA算法分析和实现

    密码学领域中,加密算法主要分为对称加密和非对称加密,随着信息时代安全性要求越来越高,对称加密因为其易被破解的原因逐渐被舍弃.而RSA算法是目前密码学世界中比较流行的非对称加密算法,命名是根据其发明者R ...

  5. C语言中复杂的声明

    C允许用户自定义数据形式. 虽然我们常用一些简单的数据形式,但是根据需要有时候会用到复杂的形式. 那么久会涉及定义一些复杂的声明.定义复杂声明之前,就必须能看懂复杂的声明. 这就需要了解一些规则和约定 ...

  6. B. Sereja and Suffixes

    B. Sereja and Suffixes time limit per test 1 second memory limit per test 256 megabytes input standa ...

  7. 2 Sum

    Problem Given an array of integers, find two numbers such that they add up to aspecific target numbe ...

  8. 搭建python开发环境

    1.下载python3.6并安装 .网址:https://www.python.org/downloads/windows/ 安装完在cmd看输入“python"是否能够出现python版本 ...

  9. Python 类 面向对象(Classes)

    Python 支持面向对象 class Greeter(object): #构造函数 def __init__(self,name): self.name = name # 创建一个实例变量 #定义一 ...

  10. 数据结构---Java---有序数组

    [自定义有序数组] 查找算法: 线性查找算法:依次对比查询: 二分查找算法:必须是有序: insert:要插入的value与数组中每个元素进行比较,当有值>value时,此处的index之后的元 ...