一个WPF小项目小结
一:缘起
老板有做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小项目小结的更多相关文章
- Extjs6(一)——用sencha cmd建立一个ExtJs小项目
本文基于ext-6.0.0 一.用sencha cmd建立一个ExtJs小项目 首先,需要一个命令行工具.进入extjs所在目录. 然后,输入:sencha -sdk [ExtJs6.0文件夹地址] ...
- 创建第一个spirngmvc小项目
题外: 设置目录为源代码目录 1.进入:file->project structure->modules->soures 进入这个里面,选择相应的文件夹.例如src/java里的ja ...
- 又见angular----步一步做一个angular4小项目
这两天看了看angular4的文档,发现他和angular1.X的差别真的是太大了,官方给出的那个管理英雄的Demo是一个非常好的入门项目,这里给出一个管理个人计划的小项目,从头至尾一步一步讲解如何去 ...
- php小项目小结
最近一直断更,并不是出于什么问题,而是想找个合适的机会去整理下html基本的一些琐碎的知识点 近期突发感冒,吊水,吊错药,原因只是重名重姓,这不是个梗,很是痛苦的现实事故 so,只能用剩下的半天去完成 ...
- scrapy的一个简单小项目
使用scrapy抓取目标url下所有的课程名和价格,并将数据保存为json格式url=http://www.tanzhouedu.com/mall/course/initAllCourse 观察网页并 ...
- express+mongoDB(mLab)做一个todolist小项目
这是在网课上学习的,先建立一个express-todolist文件夹作为项目跟目录 另外,我们直接把项目上用到的css文件和js文件下载下来放在项目里 这里直接贴出来 先建立一个public文件夹,放 ...
- 第一个Python小项目:图片转换成字符图片
实现的效果: ...
- 今天写了一个SSM小项目,运行之后,前端页面的CSS、js样式显示不出来,具体操作如下:
因为SSM中我们设置了拦截器,拦截器会拦截CSS和JS,所有样式渲染不出来,在Web.xml中写上 1 <servlet-mapping> 2 <servlet-name>de ...
- Web前端开发:SQL Jsp小项目(一)
Jsp的学习算是告一段落,针对这段时间的学习,写了一个Jsp小项目来巩固学到的知识. 框架示意图 User list process UserAdd process 需要的界面效果: 需要工具:Ecl ...
随机推荐
- 算法训练 K好数 (DP)
问题描述 如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数.求L位K进制数中K好数的数目.例如K = 4,L = 2的时候,所有K好数为11.13.20.22 ...
- ajaxs
AJAX 是一种独立于 Web 服务器软件的浏览器技术.AJAX 基于下列 Web 标准:JavaScript XML HTML CSS 在 AJAX 中使用的 Web 标准已被良好定义,并被所有的主 ...
- sap alv 单元格行列邓颜色设定(记录一下网址,供下次使用)
https://www.cnblogs.com/mingdashu/p/color_alv.html
- 【三支火把】--- 关于UEFI&PCD的总结介绍
1个人理解 个人理解PCD基本等同于Token,应当算是一种描述性语言,按照规定书写好PCD的配置档,在编译的过程中,会根据你的配置生成同等含义的C文档,而在C文档中对应会出现相应的define或者变 ...
- linux页表机制
每个进程都拥有一个自己的页表,在linux中,有一个页目录数组,这是分页机制的最高层,每个进程的页表对应其中的一个页目录项,通过cr3寄存器可以访问. 一个进程的页表,对应的页表项中对应页的物理地址. ...
- kuangbin专题十二 POJ3186 Treats for the Cows (区间dp)
Treats for the Cows Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7949 Accepted: 42 ...
- shell操作数组
#!/bin/bash nums=( ) echo ${#nums[*]} #向数组中添加元素 nums[]="http://c.biancheng.net/shell/" ech ...
- C语言中变量、全局变量与变量的作用域
什么是变量: 变量常量都是表征数据的一种形式:常量用来表示数据的值: 变量不仅可以用来表示数据的值:还可以用来存放数据:因为变量对应着一定的内存单元: 变量和常量必须先定义后使用. 变量名和常量名都是 ...
- Linq To DataTalbe 列X不属于表
项目中遇到一个问题,利用linq to datatable查询得到一个query,截止到红色代码部分时,一切都正常,只要一运行query.where 就会报异常:列“SingDate”不属于列表,查看 ...
- POJ3469Dual Core CPU
题意:给你n个模块,每个模块在A核花费为ai,在B核跑花费为bi,然后由m个任务(ai,bi,wi),表示如果ai,bi不在同一个核上跑,额外的花费为wi,求最小的花费. 分析: 用最小的费用将对象划 ...