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

而且,老周也不能把以前在K公司、Z公司和T公司中做項(xiàng)目的東西寫出來的,其實(shí)嘛,工作中的編程沒什么可寫的,無非就是 select、insert、delete、update,無非就是連接數(shù)據(jù)庫,斷開連接,同步一下數(shù)據(jù),把數(shù)據(jù)變成XML或JSON再發(fā)給另一終端。無非就是讀讀你的網(wǎng)卡CPU硬盤序列號,組成個(gè)東東再加密,計(jì)算一下授權(quán)碼,又或者生成個(gè)假冒偽劣證書給用戶授授權(quán)。再不是就寫幾個(gè)API給別人調(diào)幾下。讓腦細(xì)胞死亡率大增的,就是要?jiǎng)討B(tài)生成計(jì)算工資的公式,這個(gè)嘛,當(dāng)時(shí)老周是選用 Code Dom 來生成的,代碼生成這玩意兒,老周前些時(shí)間就寫過好些博文了,相信大伙伴們也看過了。

所以,你看,工作中用到的東西其實(shí)很片面很單一,所覆蓋的面還不如老周平時(shí)閑著沒事的時(shí)候?qū)懙男〕绦?。故,還是寫點(diǎn)簡單的東西和諧一點(diǎn),你懂我懂他也懂,豈不甚妙,人活著為啥老跟自己過不去呢,姜育恒大哥就曾經(jīng)唱過:

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

  • 曾經(jīng)在幽幽暗暗反反復(fù)復(fù)中追問

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

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

 

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

我們都知道,VS 開發(fā)環(huán)境會為項(xiàng)目自動(dòng)生成一個(gè)settings類,即用于訪問應(yīng)用程序設(shè)置的幫助類,數(shù)據(jù)是存到跟應(yīng)用程序一起的 config 文件中,比如歷史上著名的 App.config 文件。

順便提一下,VS 自動(dòng)生成的應(yīng)用設(shè)置類有一個(gè)特點(diǎn):基于應(yīng)用程序范圍的設(shè)置項(xiàng)是只讀的,基于用戶范圍的設(shè)置項(xiàng)是可讀可寫的。看不懂?沒事,你可以動(dòng)手調(diào)戲一下這個(gè)settings類的。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

在Properties節(jié)點(diǎn)下,你應(yīng)該能看到一個(gè) Settings 文件,然后打開它。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

這里你可以自己添加設(shè)置項(xiàng),注意看“范圍”這一列,它就兩個(gè)選項(xiàng),要么是基于應(yīng)用范圍,要么基于用戶范圍。好,我們?yōu)槊總€(gè)范圍各添加一個(gè)設(shè)置項(xiàng)。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

隨后,我們保存一下(必須,保存才會生成代碼),接著打開代碼,看看設(shè)計(jì)器生成的 Settings 類。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 

 代碼選段。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

        [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"]));
            }
        }

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

在屬性上應(yīng)用 ApplicationScopedSettingAttribute 表示該設(shè)置項(xiàng)是應(yīng)用程序范圍的,大伙看到,屬性中只有 get 沒有 set,說明它是只讀的。而應(yīng)用了 UserScopedSettingAttribute 的屬性表示的是用戶范圍內(nèi)的設(shè)置項(xiàng),此時(shí)看到該屬性同時(shí)有 get 和 set ,即可讀可寫。

為什么應(yīng)用程序范圍的設(shè)置項(xiàng)相關(guān)屬性會生成只讀屬性呢,后來一看MSDN就明白了,因?yàn)楫?dāng)調(diào)用相關(guān)方法保存設(shè)置時(shí),應(yīng)用程序范圍內(nèi)的設(shè)置是不會起作用的,但是不會報(bào)錯(cuò)。也就是說,要自己寫可以直接保存的設(shè)置項(xiàng),只能把屬性定義為用戶范圍內(nèi)的

 

如果覺得生成的設(shè)置類不好玩,我們可以自己寫的。

編寫這個(gè)類其實(shí)很簡單,我們只需從 ApplicationSettingsBase 類派生即可,該類位于 System.Configuration 命名空間下,它是一個(gè)抽象類。在寫自定義的應(yīng)用設(shè)置類時(shí),我們可以像普通類一樣公開屬性,這樣讀寫設(shè)置項(xiàng)時(shí)也方便,而且,你還可以直接用于數(shù)據(jù)綁定。

在包裝屬性時(shí),是通過調(diào)用基類的索引器來存取內(nèi)容的,它是一個(gè)字典模型,key是字符串類型,而value是Object類型,這樣你可以設(shè)置各種類型的值。

好,咱們寫一個(gè)來表演一下。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

    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; }
        }
    }

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

由于屬性實(shí)現(xiàn)中使用的key是字符串類型的,為了防止多次輸入時(shí)出現(xiàn)錯(cuò)誤,通??梢灶A(yù)先聲明一組字符串常量。

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

 

在類公開的屬性上除了應(yīng)用表示用戶范圍內(nèi)的標(biāo)識特性外,還應(yīng)用了 DefaultSettingValue 特性,它用來設(shè)置項(xiàng)的默認(rèn)值,值是以字符串形式表示的。

 

這個(gè)示范的設(shè)置類包裝了四個(gè)設(shè)置項(xiàng),那么,怎么耍呢。耍起來也很簡單,跟耍猴差不多。首先,你要new一個(gè)類實(shí)例,接著就可以通過我們剛才包裝的那四個(gè)屬性來讀寫設(shè)置項(xiàng),最后,調(diào)用 Save 方法,就可以把修改后的數(shù)據(jù)保存到配置文件中。

 

讓設(shè)置類與用戶界面交互,最簡單最方便的方法是使用綁定,比如這樣。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

        <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}"/>

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 

這個(gè)設(shè)置類是可以進(jìn)行雙向綁定的,因?yàn)榛?nbsp;ApplicationSettingsBase 實(shí)現(xiàn)了 INotifyPropertyChanged 接口。通常我們可以在窗口關(guān)閉時(shí)保存配置。

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

 

以前我們開發(fā)程序,都習(xí)慣在界面上放一個(gè)保存按鈕,當(dāng)用戶點(diǎn)擊后保存,不過現(xiàn)在好像流行了,因?yàn)橛脩粜薷耐暝O(shè)置后還要點(diǎn)一按鈕來保存,操作有點(diǎn)復(fù)雜,讓窗口在關(guān)閉時(shí)自動(dòng)保存設(shè)置,顯得更友好。

那么,這個(gè)破文件到底保存到哪里去了,在應(yīng)用所在目錄中的配置文件中并沒有。應(yīng)用目錄中的配置文件存的應(yīng)用程序級別的設(shè)置,用戶級別的配置應(yīng)該與當(dāng)前用戶的私人目錄有關(guān)。

打開文件管理器,在地址欄中輸入:%UserProfile%\AppData\Local,然后回車,就會進(jìn)入當(dāng)前用戶文件夾下的appData的Local子目錄,然后,在這個(gè)目錄下,你會看到一個(gè)以你的應(yīng)用程序命名的文件夾,然后你繼續(xù)進(jìn)入子目錄,直到看到一個(gè)名為 user.config 的文件。對,就是它了,不信你打開看看。

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

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

電腦培訓(xùn),計(jì)算機(jī)培訓(xùn),平面設(shè)計(jì)培訓(xùn),網(wǎng)頁設(shè)計(jì)培訓(xùn),美工培訓(xùn),Web培訓(xùn),Web前端開發(fā)培訓(xùn)

 

另外,ApplicationSettingsBase 類有幾個(gè)事件比較有用,必要時(shí)可以用上。當(dāng)設(shè)置數(shù)加載后會發(fā)生 SettingsLoaded 事件,從名字中也能知道其用途;在設(shè)置項(xiàng)被修改之前,會發(fā)生 SettingChanging 事件,修改之后會發(fā)生 PropertyChanged 事件(實(shí)現(xiàn)了INotifyPropertyChanged接口);當(dāng)調(diào)用 Save 方法保存之前,會引發(fā) SettingsSaving 事件,事件參數(shù)會包含一個(gè) Cancel 屬性,如果想取消保存,可以將該屬性設(shè)置為 true。

http://www.cnblogs.com/tcjiaan/p/7227861.html