WM有約(二):配置信息

WM有約(二):配置信息

 

Written by Allen Lee

 

添加配置文件

首先,向項目添加一個Options.xml文件,這個文件將會用來儲存應用程序的配置信息:

121308_1546_WM1.png

圖 1

接着,把Options.xml的Copy to Output Directory屬性的值改爲Copy if newer:

121308_1546_WM2.png

圖 2

然後,就是爲Options.xml添加配置信息了:

121308_1546_WM3.png

代碼 1

那麼,我們如何使用這個文件呢?關於這個問題,我首先想到的是爲它創建一個OptionManager類,在我的想象裏,它應該是這樣使用的:

121308_1546_WM4.png

代碼 2

在繼續之前,我想請你思考一個問題:你會如何實現OptionManager的Options成員呢?下面是我的做法,使用了單例模式和索引器:

121308_1546_WM5.png

代碼 3

當然,你也可以學ConfigurationManager類那樣,通過AppSettings靜態屬性返回一個NameValueCollection對象。接下來的問題是,如何訪問Options.xml呢?由於Options.xml上面的配置信息實際上只是一組鍵/值對,於是你可以考慮在OptionManager的構造函數裏把它們全部讀到一個內部的Dictionary對象裏:

121308_1546_WM6.png

代碼 4

LoadOptions方法使用了LINQ to XML來讀取Options.xml裏的配置信息,並以Dictionary的形式返回:

121308_1546_WM7.png

代碼 5

這裏使用了GetXmlPath方法來獲取Options.xml的路徑:

121308_1546_WM8.png

代碼 6

OptionManager提供了一個Save方法,用於保存配置信息:

121308_1546_WM9.png

代碼 7

其中,SaveOptions方法也使用了LINQ to XML來構建並保存配置信息:

121308_1546_WM10.png

代碼 8

最後就是OptionManager的索引器了:

121308_1546_WM11.png

代碼 9

 

設計選項窗體

說到選項窗體,你會如何設計?我想象中的選項窗體大致像這樣:

121308_1546_WM12.png

圖 3

我用了一個NumericUpDown控件來收集MaxSelectionCount的配置信息,另外用了兩個DateTimePicker控件分別收集MinDate和MaxDate的配置信息。

接着,我們來看看底下兩個菜單項。Cancel菜單項比較簡單,僅僅把窗體的DialogResult設爲Cancel:

121308_1546_WM13.png

代碼 10

而OK菜單項的任務就多一點,它要保存用戶的配置信息:

121308_1546_WM14.png

代碼 11

接着就是修改一下主窗體的菜單:

121308_1546_WM15.png

圖 4

Save菜單項和以前一樣,而Options菜單項將會打開選項窗體:

121308_1546_WM16.png

代碼 12

現在,我們來運行一下這個應用程序:

121308_1546_WM17.png

圖 5

121308_1546_WM18.png

圖 6

有問題!選項窗體打開的時候,上面的控件沒有反映配置文件裏面的信息,這是因爲我沒有實現這樣的邏輯,同樣地,這個問題也會發生在主窗體身上,這意味着無論我們如何修改配置文件,重新啓動應用程序之後,主窗體將會恢復默認配置,何等嚴重!

首先是選項窗體打開的時候需要讀取配置信息到對應的控件上:

121308_1546_WM19.png

代碼 13

121308_1546_WM20.png

代碼 14

由於讀取配置信息的代碼和代碼12裏的那部分是相同的,所以我把它提取出來,放在SetupOptions方法裏,這樣,代碼12就簡化爲:

121308_1546_WM21.png

代碼 15

再次運行應用程序:

121308_1546_WM22.png

圖 7

這次正常了。不過還有一個小問題,選項窗體裏保存配置信息的代碼屬於OK菜單項而不是選項窗體的,當用戶單擊窗體右上角的OK按鈕時,雖然窗體的DialogResult屬性返回OK,但實質上沒有執行任何保存配置信息的操作,這就導致了窗體行爲的不一致。解決這個問題的辦法有兩個,一個是去掉窗體右上角的OK按鈕,另一個是把OK菜單項裏保存配置信息的代碼放到窗體層面上做。前一種做法很簡單,只需要把選項窗體的ControlBox屬性設爲false就行了。至於後一種做法,在繼續討論之前,我想先考一考你,我應該選擇Deactivate事件還是Closing事件呢?答案是兩個都可以,因爲選項窗體是通過ShowDialog方法打開的,關閉這樣的窗體是真的關閉了而不是像主窗體那樣最小化到後臺,所以我們可以放膽使用Closing事件:

121308_1546_WM23.png

代碼 16

還有一個不是問題的問題,就是當你關閉選項窗體時,你會發現畫面突然停頓,你知道這個時候OptionManager在保存配置信息,但用戶並不知道,這可能會給用戶留下不好的印象/感受,要讓用戶知道後臺正在執行任務,最簡單的辦法就是在屏幕正中顯示等待指針,當然,任務完成之後記得去掉等待指針,否則……

 

你還想要什麼?

下一集,除了上一集剩下的兩個需求之外,我們還會探討兩個新的需求:

  • 支持日期的包含,比如說2009年2月14日被指定爲屆時要選的日期。
  • 如果指定一個週期,應用程序將會綜合排除邏輯、包含邏輯和這個週期計算下一個將要被選中的日期,並顯示在主界面上。
發佈了128 篇原創文章 · 獲贊 1 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章