天天看點

【.net 深呼吸】自己動手來寫應用程式設定類

在開始裝逼之前,老周先說明一件事。有人說老周寫的東西太簡單了,能不能寫點複雜點。這問題就來了,要寫什麼東西才叫“複雜”?最重要的是,寫得太複雜了,一方面很多朋友看不懂,另一方面,連老周自己也不知道怎麼表述。

而且,老周也不能把以前在K公司、Z公司和T公司中做項目的東西寫出來的,其實嘛,工作中的程式設計沒什麼可寫的,無非就是 select、insert、delete、update,無非就是連接配接資料庫,斷開連接配接,同步一下資料,把資料變成XML或JSON再發給另一終端。無非就是讀讀你的網卡CPU硬碟序列号,組成個東東再加密,計算一下授權碼,又或者生成個假冒僞劣證書給使用者授授權。再不是就寫幾個API給别人調幾下。讓腦細胞死亡率大增的,就是要動态生成計算工資的公式,這個嘛,當時老周是選用 Code Dom 來生成的,代碼生成這玩意兒,老周前些時間就寫過好些博文了,相信大夥伴們也看過了。

是以,你看,工作中用到的東西其實很片面很單一,所覆寫的面還不如老周平時閑着沒事的時候寫的小程式。故,還是寫點簡單的東西和諧一點,你懂我懂他也懂,豈不甚妙,人活着為啥老跟自己過不去呢,姜育恒大哥就曾經唱過:

不管明天要面對多少傷痛和迷惑

曾經在幽幽暗暗反反複複中追問

才知道平平淡淡從從容容是最真

平淡是福,簡單是樂,誰謂不然?

好了,上面的鬼話說完了,下面咱們開始說人話。

我們都知道,VS 開發環境會為項目自動生成一個settings類,即用于通路應用程式設定的幫助類,資料是存到跟應用程式一起的 config 檔案中,比如曆史上著名的 App.config 檔案。

順便提一下,VS 自動生成的應用設定類有一個特點:基于應用程式範圍的設定項是隻讀的,基于使用者範圍的設定項是可讀可寫的。看不懂?沒事,你可以動手調戲一下這個settings類的。

【.net 深呼吸】自己動手來寫應用程式設定類

在Properties節點下,你應該能看到一個 Settings 檔案,然後打開它。

【.net 深呼吸】自己動手來寫應用程式設定類

這裡你可以自己添加設定項,注意看“範圍”這一列,它就兩個選項,要麼是基于應用範圍,要麼基于使用者範圍。好,我們為每個範圍各添加一個設定項。

【.net 深呼吸】自己動手來寫應用程式設定類

随後,我們儲存一下(必須,儲存才會生成代碼),接着打開代碼,看看設計器生成的 Settings 類。

【.net 深呼吸】自己動手來寫應用程式設定類

 代碼選段。

在屬性上應用 ApplicationScopedSettingAttribute 表示該設定項是應用程式範圍的,大夥看到,屬性中隻有 get 沒有 set,說明它是隻讀的。而應用了 UserScopedSettingAttribute 的屬性表示的是使用者範圍内的設定項,此時看到該屬性同時有 get 和 set ,即可讀可寫。

為什麼應用程式範圍的設定項相關屬性會生成隻讀屬性呢,後來一看MSDN就明白了,因為當調用相關方法儲存設定時,應用程式範圍内的設定是不會起作用的,但是不會報錯。也就是說,要自己寫可以直接儲存的設定項,隻能把屬性定義為使用者範圍内的。

如果覺得生成的設定類不好玩,我們可以自己寫的。

編寫這個類其實很簡單,我們隻需從 ApplicationSettingsBase 類派生即可,該類位于 System.Configuration 命名空間下,它是一個抽象類。在寫自定義的應用設定類時,我們可以像普通類一樣公開屬性,這樣讀寫設定項時也友善,而且,你還可以直接用于資料綁定。

在包裝屬性時,是通過調用基類的索引器來存取内容的,它是一個字典模型,key是字元串類型,而value是Object類型,這樣你可以設定各種類型的值。

好,咱們寫一個來表演一下。

由于屬性實作中使用的key是字元串類型的,為了防止多次輸入時出現錯誤,通常可以預先聲明一組字元串常量。

在類公開的屬性上除了應用表示使用者範圍内的辨別特性外,還應用了 DefaultSettingValue 特性,它用來設定項的預設值,值是以字元串形式表示的。

這個示範的設定類包裝了四個設定項,那麼,怎麼耍呢。耍起來也很簡單,跟耍猴差不多。首先,你要new一個類執行個體,接着就可以通過我們剛才包裝的那四個屬性來讀寫設定項,最後,調用 Save 方法,就可以把修改後的資料儲存到配置檔案中。

讓設定類與使用者界面互動,最簡單最友善的方法是使用綁定,比如這樣。

這個設定類是可以進行雙向綁定的,因為基類 ApplicationSettingsBase 實作了 INotifyPropertyChanged 接口。通常我們可以在視窗關閉時儲存配置。

以前我們開發程式,都習慣在界面上放一個儲存按鈕,當使用者點選後儲存,不過現在好像流行了,因為使用者修改完設定後還要點一按鈕來儲存,操作有點複雜,讓視窗在關閉時自動儲存設定,顯得更友好。

那麼,這個破檔案到底儲存到哪裡去了,在應用所在目錄中的配置檔案中并沒有。應用目錄中的配置檔案存的應用程式級别的設定,使用者級别的配置應該與目前使用者的私人目錄有關。

打開檔案管理器,在位址欄中輸入:%UserProfile%\AppData\Local,然後回車,就會進入目前使用者檔案夾下的appData的Local子目錄,然後,在這個目錄下,你會看到一個以你的應用程式命名的檔案夾,然後你繼續進入子目錄,直到看到一個名為 user.config 的檔案。對,就是它了,不信你打開看看。

另外,ApplicationSettingsBase 類有幾個事件比較有用,必要時可以用上。當設定數加載後會發生 SettingsLoaded 事件,從名字中也能知道其用途;在設定項被修改之前,會發生 SettingChanging 事件,修改之後會發生 PropertyChanged 事件(實作了INotifyPropertyChanged接口);當調用 Save 方法儲存之前,會引發 SettingsSaving 事件,事件參數會包含一個 Cancel 屬性,如果想取消儲存,可以将該屬性設定為 true。

示例源代碼下載下傳位址:請點選▶這裡◀