一个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

posted @ 2015-01-05 22:06  电阻起火lyt  阅读(3380)  评论(10编辑  收藏  举报