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

相關文章
相關標籤/搜索