一个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 ...
随机推荐
- 洛谷P3301 [SDOI2013]方程(扩展Lucas+组合计数)
题面 传送门 题解 为啥全世界除了我都会\(exLucas\)啊--然而我连中国剩余定理都不会orz 不知道\(exLucas\)是什么的可以去看看yx巨巨的这篇博客->这里 好了现在我们就解决 ...
- css 选择器;盒模型
一.引入方式:(1)CSS 层叠样式表 作用:修饰网页结构 (2)css的三种引入方式 - 行内样式 注意:行内样式的优先级是最高的 - 内接样式 - 外接样式 二.css选择器 基础选择器 * 通配 ...
- Oracle复制表
Oracle复制表分为只复制表结构或者结构和数据均复制两种: 只复制表结构 create table newTableName as select * from oldTableName where ...
- P3554 [POI2013]LUK-Triumphal arch
\(\color{#0066ff}{ 题目描述 }\) 给一颗树,1号节点已经被染黑,其余是白的,两个人轮流操作,一开始B在1号节点,A选择k个点染黑,然后B走一步,如果B能走到A没染的节点则B胜,否 ...
- 平衡树学习笔记(2)-------Treap
Treap 上一篇:平衡树学习笔记(1)-------简介 Treap是一个玄学的平衡树 为什么说它玄学呢? 还记得上一节说过每个平衡树都有自己的平衡方式吗? 没错,它平衡的方式是......rand ...
- luogu2480 [SDOI2010]古代猪文
link 题意一开始没TM读懂... 就是给定一个\(G\le10^{10},N\le10^9\),求\(G^{\sum_{d|n}{n\choose d}}\),对999911659取模 由于999 ...
- 10.18 NOIP2018提高组模拟题(二)
大水题 1.咒语 (curse.pas/c/cpp) [题目描述] 亮亮梦到自己来到了魔法城堡,但一扇巨大的石门阻拦了他通向城堡内的路.正当他沮丧之际,突然发现门上有一处机关,机关上有一张很长的纸条. ...
- Step by Step: 基于MFC下的COM组件开发-Helloworld
http://blog.csdn.net/sybifei/article/details/45008745 [这篇文章有问题, 仅供参考] http://blog.csdn.net/define_us ...
- php 多语言(UTF-8编码)导出Excel、CSV乱码解决办法之导出UTF-8编码的Excel、CSV
新项目,大概情况是这样的:可能存在多国.不同语种使用者,比喻有中文.繁体中文,韩文.日本等等,开发时选择了UTF-8编码,开发顺利,没有问题.昨天做了一个csv导出功能,导出的东西完全乱了: 设置mb ...
- sharepoint_study_12
描述:SharePoint新建Web应用程序时提示如下错误: 解决: 1. Go to IIS 2. Select the DefaultAppPool and Go to the Advanced ...