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

來源:互聯網
上載者:User

標籤:pat   內容   串連數   title   開發   set   code   目的   工作   

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

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

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

  • 不管明天要面對多少傷痛和迷惑
  • 曾經在幽幽暗暗反反覆複中追問
  • 才知道平平淡淡從從容容是最真

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

 

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

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

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

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

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

隨後,我們儲存一下(必須,儲存才會產生代碼),接著開啟代碼,看看設計器產生的 Settings 類。

 

 代碼選段。

        [global::System.Configuration.UserScopedSettingAttribute()]        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]        [global::System.Configuration.DefaultSettingValueAttribute("0")]        public byte TestV1 {            get {                return ((byte)(this["TestV1"]));            }            set {                this["TestV1"] = value;            }        }                [global::System.Configuration.ApplicationScopedSettingAttribute()]        [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]        [global::System.Configuration.DefaultSettingValueAttribute("0")]        public int TestV2 {            get {                return ((int)(this["TestV2"]));            }        }

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

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

 

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

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

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

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

    internal class AppSettings : ApplicationSettingsBase    {        #region 常量        const string APP_TITLE = "appTitle";        const string APP_USAGE = "appUsage";        const string USER_NAME = "userName";        const string USE_YEARS = "useYears";        #endregion        [UserScopedSetting]        [DefaultSettingValue("my app")]        public string AppTitle        {            set            {                this[APP_TITLE] = value;            }            get { return (string)this[APP_TITLE]; }        }        [UserScopedSetting]        [DefaultSettingValue("用於裝X")]        public string AppUsage        {            get { return (string)this[APP_USAGE]; }            set { this[APP_USAGE] = value; }        }        [UserScopedSetting]        [DefaultSettingValue("大傻冬")]        public string UserName        {            get { return (string)this[USER_NAME]; }            set { this[USER_NAME] = value; }        }        [UserScopedSetting]        [DefaultSettingValue("3")]        public int UseYears        {            get { return (int)this[USE_YEARS]; }            set { this[USE_YEARS] = value; }        }    }

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

        const string APP_TITLE = "appTitle";        const string APP_USAGE = "appUsage";        const string USER_NAME = "userName";        const string USE_YEARS = "useYears";

 

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

 

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

 

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

        <TextBox Grid.Column="1" Text="{Binding Path=AppTitle, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>        <TextBox Grid.Column="1" Grid.Row="1" Text="{Binding Path=AppUsage,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>        <TextBox Grid.Column="1" Grid.Row="2" Text="{Binding Path=UserName,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>        <TextBox Grid.Column="1" Grid.Row="3" Text="{Binding Path=UseYears,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/>

 

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

        protected override void OnClosing(CancelEventArgs e)        {            base.OnClosing(e);            settings.Save();        }

 

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

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

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

<configuration>    <configSections>        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >            <section name="DemoApp.AppSettings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />        </sectionGroup>    </configSections>    <userSettings>        <DemoApp.AppSettings>            <setting name="UseYears" serializeAs="String">                <value>2</value>            </setting>            <setting name="UserName" serializeAs="String">                <value>矮冬瓜</value>            </setting>            <setting name="AppUsage" serializeAs="String">                <value>用於忽悠未成年人</value>            </setting>            <setting name="AppTitle" serializeAs="String">                <value>天國第一假貨</value>            </setting>        </DemoApp.AppSettings>    </userSettings></configuration>

 

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

 

樣本原始碼:請點擊?這裡?

 

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.