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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM