一个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就好了spa

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

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

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

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

导出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

相关文章
相关标签/搜索