Written by Allen Lee 添加配置文件 首先,向項(xiàng)目添加一個(gè)Options.xml文件,這個(gè)文件將會(huì)用來(lái)儲(chǔ)存應(yīng)用程序的配置信息: 圖 1 接著,把Options.xml的Copy to Output Directory屬性的值改為Copy if newer: 圖 2 然后,就 " /> 草久热的视频在线观看,6080YYY午夜理论片在线观看,99热精品一区

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

WM有約(二):配置信息


Written by Allen Lee

 

添加配置文件

首先,向項(xiàng)目添加一個(gè)Options.xml文件,這個(gè)文件將會(huì)用來(lái)儲(chǔ)存應(yīng)用程序的配置信息:

圖 1

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

圖 2

然后,就是為Options.xml添加配置信息了:

代碼 1

那么,我們?nèi)绾问褂眠@個(gè)文件呢?關(guān)于這個(gè)問(wèn)題,我首先想到的是為它創(chuàng)建一個(gè)OptionManager類(lèi),在我的想象里,它應(yīng)該是這樣使用的:

代碼 2

在繼續(xù)之前,我想請(qǐng)你思考一個(gè)問(wèn)題:你會(huì)如何實(shí)現(xiàn)OptionManager的Options成員呢?下面是我的做法,使用了單例模式和索引器:

代碼 3

當(dāng)然,你也可以學(xué)ConfigurationManager類(lèi)那樣,通過(guò)AppSettings靜態(tài)屬性返回一個(gè)NameValueCollection對(duì)象。接下來(lái)的問(wèn)題是,如何訪(fǎng)問(wèn)Options.xml呢?由于Options.xml上面的配置信息實(shí)際上只是一組鍵/值對(duì),于是你可以考慮在OptionManager的構(gòu)造函數(shù)里把它們?nèi)孔x到一個(gè)內(nèi)部的Dictionary對(duì)象里:

代碼 4

LoadOptions方法使用了LINQ to XML來(lái)讀取Options.xml里的配置信息,并以Dictionary的形式返回:

代碼 5

這里使用了GetXmlPath方法來(lái)獲取Options.xml的路徑:

代碼 6

OptionManager提供了一個(gè)Save方法,用于保存配置信息:

代碼 7

其中,SaveOptions方法也使用了LINQ to XML來(lái)構(gòu)建并保存配置信息:

代碼 8

最后就是OptionManager的索引器了:

代碼 9

 

設(shè)計(jì)選項(xiàng)窗體

說(shuō)到選項(xiàng)窗體,你會(huì)如何設(shè)計(jì)?我想象中的選項(xiàng)窗體大致像這樣:

圖 3

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

接著,我們來(lái)看看底下兩個(gè)菜單項(xiàng)。Cancel菜單項(xiàng)比較簡(jiǎn)單,僅僅把窗體的DialogResult設(shè)為Cancel:

代碼 10

而OK菜單項(xiàng)的任務(wù)就多一點(diǎn),它要保存用戶(hù)的配置信息:

代碼 11

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

圖 4

Save菜單項(xiàng)和以前一樣,而Options菜單項(xiàng)將會(huì)打開(kāi)選項(xiàng)窗體:

代碼 12

現(xiàn)在,我們來(lái)運(yùn)行一下這個(gè)應(yīng)用程序:

圖 5

圖 6

有問(wèn)題!選項(xiàng)窗體打開(kāi)的時(shí)候,上面的控件沒(méi)有反映配置文件里面的信息,這是因?yàn)槲覜](méi)有實(shí)現(xiàn)這樣的邏輯,同樣地,這個(gè)問(wèn)題也會(huì)發(fā)生在主窗體身上,這意味著無(wú)論我們?nèi)绾涡薷呐渲梦募匦聠?dòng)應(yīng)用程序之后,主窗體將會(huì)恢復(fù)默認(rèn)配置,何等嚴(yán)重!

首先是選項(xiàng)窗體打開(kāi)的時(shí)候需要讀取配置信息到對(duì)應(yīng)的控件上:

代碼 13

代碼 14

由于讀取配置信息的代碼和代碼12里的那部分是相同的,所以我把它提取出來(lái),放在SetupOptions方法里,這樣,代碼12就簡(jiǎn)化為:

代碼 15

再次運(yùn)行應(yīng)用程序:

圖 7

這次正常了。不過(guò)還有一個(gè)小問(wèn)題,選項(xiàng)窗體里保存配置信息的代碼屬于OK菜單項(xiàng)而不是選項(xiàng)窗體的,當(dāng)用戶(hù)單擊窗體右上角的OK按鈕時(shí),雖然窗體的DialogResult屬性返回OK,但實(shí)質(zhì)上沒(méi)有執(zhí)行任何保存配置信息的操作,這就導(dǎo)致了窗體行為的不一致。解決這個(gè)問(wèn)題的辦法有兩個(gè),一個(gè)是去掉窗體右上角的OK按鈕,另一個(gè)是把OK菜單項(xiàng)里保存配置信息的代碼放到窗體層面上做。前一種做法很簡(jiǎn)單,只需要把選項(xiàng)窗體的ControlBox屬性設(shè)為false就行了。至于后一種做法,在繼續(xù)討論之前,我想先考一考你,我應(yīng)該選擇Deactivate事件還是Closing事件呢?答案是兩個(gè)都可以,因?yàn)檫x項(xiàng)窗體是通過(guò)ShowDialog方法打開(kāi)的,關(guān)閉這樣的窗體是真的關(guān)閉了而不是像主窗體那樣最小化到后臺(tái),所以我們可以放膽使用Closing事件:

代碼 16

還有一個(gè)不是問(wèn)題的問(wèn)題,就是當(dāng)你關(guān)閉選項(xiàng)窗體時(shí),你會(huì)發(fā)現(xiàn)畫(huà)面突然停頓,你知道這個(gè)時(shí)候OptionManager在保存配置信息,但用戶(hù)并不知道,這可能會(huì)給用戶(hù)留下不好的印象/感受,要讓用戶(hù)知道后臺(tái)正在執(zhí)行任務(wù),最簡(jiǎn)單的辦法就是在屏幕正中顯示等待指針,當(dāng)然,任務(wù)完成之后記得去掉等待指針,否則……

 

你還想要什么?

下一集,除了上一集剩下的兩個(gè)需求之外,我們還會(huì)探討兩個(gè)新的需求:

  • 支持日期的包含,比如說(shuō)2009年2月14日被指定為屆時(shí)要選的日期。
  • 如果指定一個(gè)周期,應(yīng)用程序?qū)?huì)綜合排除邏輯、包含邏輯和這個(gè)周期計(jì)算下一個(gè)將要被選中的日期,并顯示在主界面上。

 

 

相關(guān)文章:WM有約(一):你好,CF

NET技術(shù)WM有約(二):配置信息,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 成人女人A级毛片免费软件 成人免费在线视频 | 8090碰成年女人免费碰碰尤物 | 秋霞鲁丝片Av无码 | 蜜桃传媒在线观看 | 一抽一出BGM免费3分钟 | 18禁在线无遮挡羞羞漫画 | 人妖xxhdxx| 2018久久视频在线视频观看 | 国产精品久久久久久久久久免费 | 亚洲午夜性春猛交XXXX | 777久久人妻少妇嫩草AV蜜桃 | 久久毛片免费看一区二区三区 | 老女老肥熟国产在线视频 | 亚洲理论片在线中文字幕 | 性女传奇 快播 | 欧美内射AAAAAAXXXXX | 国产线精品视频在线观看 | 亚洲欧洲无码AV在线观看你懂的 | 我要女人的全黄录像 | 久久久97人妻无码精品蜜桃 | 午夜亚洲动漫精品AV网站 | 把内衣脱了把奶露出来 | 久久精品天天中文字幕 | 经典三级四虎在线观看 | 大乳牛奶女在线观看 | 精品视频免费在线观看 | 欧美黑人经典片免费观看 | 热99re久久精品国产首页 | 性按摩AAAAAAA片 | 中文字幕乱码一区AV久久 | www.伊人 | 久久怡红院国产精品 | 中文字幕在线视频观看 | 在线亚洲免费 | 5g在线视讯年龄确认海外禁止进入 | 久久99国产精品二区不卡 | 成年女人免费播放影院 | 秋霞电影网午夜鲁丝片无码 | 精品国产在线观看福利 | 伊人久久大香线蕉综合亚洲 | 国产精品97久久AV色婷婷 |