WM有约II(二):持续改进
WM有約II(二):持續(xù)改進(jìn)
?
Written by Allen Lee
?
自定義"你在干嘛?"
在上一集結(jié)束的時(shí)候,我們發(fā)現(xiàn)一個(gè)極其嚴(yán)重的問題——這個(gè)應(yīng)用程序會(huì)忽略我們最初希望截獲的"你在干嘛?"!這怎么行?好,馬上添加一個(gè)Configuration.xml:
代碼 1
這段配置信息包含了4個(gè)截獲設(shè)置,它們分別用于截獲"計(jì)算機(jī)"版、普通話版、廣東話版和英文版的"你在干嘛?"。每個(gè)截獲設(shè)置都會(huì)有一個(gè)comparisonType屬性,它是用來指定比較方式的,Equal意味著只有短信息的內(nèi)容和指定的字眼相等才把它截下來,而Contains則意味著只要短信息包含指定的字眼就把它截下來。
上面這段配置信息是用來構(gòu)建MessageInterceptor對(duì)象的,這項(xiàng)工作將會(huì)由InterceptionManager來負(fù)責(zé),而完成這項(xiàng)工作的代碼將會(huì)放在它的構(gòu)造函數(shù)里:
代碼 2
這段代碼首先使用Helper.MapPath方法獲取配置文件的完整路徑,接著把配置信息讀到XElement對(duì)象里,然后根據(jù)這些信息構(gòu)建出MessageInterceptor對(duì)象,最后把構(gòu)建好的對(duì)象存到"本地"。需要說明的是,comparisonType屬性所使用的值其實(shí)就是MessagePropertyComparisonType枚舉的字面值,所以這里直接使用Enum.Parse方法來解析這些值。如果你讀過第一輯的《WM有約》,那么你應(yīng)該不會(huì)對(duì)Helper.MapPath方法的實(shí)現(xiàn)感到陌生:
代碼 3
好了嗎?還沒有,因?yàn)槲覀冞€沒告訴這些MessageInterceptor如何處理截獲的短信息。InterceptionManager提供了AttachInterceptionHandler方法,可以協(xié)助我們完成這項(xiàng)工作:
代碼 4
有了這些準(zhǔn)備,我們就可以把使用MessageInterceptor的代碼(參見《WM有約II(一):你在干嘛?》代碼4)改成使用InterceptionManager了:
代碼 5
?
自定義狀態(tài)
在上一集里,我們把可選的狀態(tài)直接寫在代碼里(參見《WM有約II(一):你在干嘛?》代碼3),這種做法當(dāng)然是不推薦的;在這一集里,我們將會(huì)把這些狀態(tài)挪到配置文件里。首先,在Configuration.xml里加入下面這段配置信息:
代碼 6
這些信息的讀取是由StatusTextManager來負(fù)責(zé)的,而完成這項(xiàng)工作的代碼將會(huì)放在它的構(gòu)造函數(shù)里:
代碼 7
這里之所以選用BindingList<T>來存儲(chǔ)數(shù)據(jù)主要是為了實(shí)現(xiàn)數(shù)據(jù)綁定,當(dāng)集合里的數(shù)據(jù)發(fā)生改變時(shí),用戶界面上的那個(gè)ComboBox里的數(shù)據(jù)會(huì)跟著調(diào)整,而StatusTextManager也會(huì)把改變后的數(shù)據(jù)保存到配置文件里:
代碼 8
有了這些準(zhǔn)備,我們就可以使用StatusTextManager來讀取配置文件里存儲(chǔ)的狀態(tài)數(shù)據(jù)了:
那么,用戶如何編輯這些狀態(tài)信息呢?總不見的讓用戶直接修改配置文件吧?于是,Status Texts Editor誕生了:
圖 1
這個(gè)窗體在構(gòu)造的時(shí)候會(huì)從StatusTextManager那里取得狀態(tài)數(shù)據(jù),然后綁定到ListBox上:
代碼 9
一開始,這個(gè)窗體下面的4個(gè)控件(一個(gè)Label、一個(gè)TextBox和兩個(gè)Button)都是隱藏的(Visible屬性值為false),當(dāng)用戶單擊Add按鈕或者M(jìn)odify按鈕時(shí),這4個(gè)控件就會(huì)顯示出來,并把m_OKAction設(shè)為OK按鈕此時(shí)應(yīng)該執(zhí)行的操作:
代碼 10
代碼 11
OK按鈕將負(fù)責(zé)執(zhí)行m_OKAction委托所指定的操作:
代碼 12
而Cancel按鈕則負(fù)責(zé)把這4個(gè)控件隱藏起來:
代碼 13
Remove按鈕的代碼也非常簡(jiǎn)單:
代碼 14
至于ShowControls方法和HideControls方法,只不過是把那4個(gè)控件的Visible屬性設(shè)為相應(yīng)的值,比較簡(jiǎn)單,就不在這里展示它們的代碼了。
現(xiàn)在萬事俱備,只欠主窗體上的一個(gè)按鈕了:
圖 2
最后就是在用戶單擊這個(gè)按鈕時(shí)打開Status Texts Editor:
代碼 15
?
選擇聯(lián)系人
目前,這個(gè)應(yīng)用程序還有一個(gè)地方做得不夠好的,也是上一集結(jié)束時(shí)提到的,當(dāng)用戶想查詢某個(gè)朋友的狀態(tài)時(shí),要手動(dòng)輸入對(duì)方的手機(jī)號(hào)碼,于是萌生了讓用戶可以通過另一個(gè)對(duì)話框選擇聯(lián)系人里面的手機(jī)號(hào)碼,不過這次我不打算自己開發(fā)這樣一個(gè)對(duì)話框了,因?yàn)閃indows Mobile 6 Professional SDK已經(jīng)提供了一個(gè)很好的ChooseContactDialog了!
首先,在主窗體上添加一個(gè)按鈕:
圖 3
接著,引用Microsoft.WindowsMobile.Forms.dll以及Microsoft.WindowsMobile.Forms和Microsoft.WindowsMobile.PocketOutlook兩個(gè)命名空間。好了,現(xiàn)在我們可以使用ChooseContactDialog了:
代碼 16
上面這段代碼會(huì)對(duì)聯(lián)系人進(jìn)行過濾(通過RequiredProperties屬性),只顯示有手機(jī)號(hào)碼的聯(lián)系人,當(dāng)用戶單擊ChooseContactDialog對(duì)話框上的OK按鈕時(shí),選中的聯(lián)系人的手機(jī)號(hào)碼將會(huì)顯示在TextBox上。
?
表演時(shí)間到了!
應(yīng)用程序啟動(dòng)的時(shí)候,狀態(tài)列表里的第一個(gè)狀態(tài)(在這里是"I'm free now.")將被設(shè)為當(dāng)前狀態(tài):
圖 4
單擊ComboBox右邊的按鈕打開Status Texts Editor:
圖 5
單擊Add按鈕添加一個(gè)新的狀態(tài):
圖 6
單擊下面的OK按鈕保存這個(gè)狀態(tài),然后關(guān)閉Status Texts Editor。
現(xiàn)在,我們來測(cè)試一下這個(gè)應(yīng)用程序能否截獲"你在干嘛?",打開Cellular Emulator,并用它向模擬器發(fā)送"What are you doing now?"(因?yàn)槲覜]有安裝中文版的模擬器鏡像~):
圖 7
嗯,沒問題,接著向模擬器發(fā)送"{Trombone:PingStatus}",居然沒有截獲!
圖 8
怎么回事?目前這些MessageInterceptor對(duì)象是存放在InterceptionManager內(nèi)部的集合里,如果我把它們"提取"出來,以一個(gè)個(gè)私有成員的形式放在主窗體里會(huì)怎樣呢?
圖 9
正如上圖所示,"What are you doing now?"和"{Trombone:PingStatus}"兩條短信息都順利截獲并成功返回當(dāng)前狀態(tài)!真是非常郁悶啊!一時(shí)三刻我也想不出什么解決方法,只好硬著頭皮把截獲設(shè)置寫到代碼里了~~~如果你有好的想法,歡迎提出!
接下來,我們看看ChooseContactDialog對(duì)話框,單擊主窗體下面那個(gè)TextBox右邊的按鈕,將會(huì)打開ChooseContactDialog對(duì)話框:
圖 10
選中一個(gè)聯(lián)系人,然后單擊Select菜單項(xiàng),ChooseContactDialog對(duì)話框?qū)?huì)關(guān)閉,選中的聯(lián)系人的手機(jī)號(hào)碼將會(huì)顯示在主窗體下面那個(gè)TextBox里:
圖 11
單擊Ping按鈕,Cellular Emulator將會(huì)收到模擬器發(fā)送的短信息:
圖 12
?
你還想要什么?
很久很久之前我就明白一個(gè)道理,想要的東西不可能全部都得到,但我就是不甘心,我應(yīng)該就此作罷嗎?我知道我很任性,常常執(zhí)著于這些看起來很不應(yīng)該的事情,但我只是不想留下遺憾。我決定在結(jié)束這篇文章之前再測(cè)一次InterceptionManager。
這次,我關(guān)閉并重新打開Cellular Emulator,軟重置模擬器,然后通過Visual Studio 2008再次運(yùn)行應(yīng)用程序。啊~~~~~~
圖 13
我到底應(yīng)該說"奇跡"還是"奇怪"?我用Cellular Emulator依次向模擬器發(fā)送以下短信息:
- What are you doing now?
- {Trombone:PingStatus}
- Hey, boy. What are you doing there?
- {Trombone:PingStatus}
所有短信息都順利截獲并成功返回當(dāng)前狀態(tài)!我已經(jīng)徹底無語了~~~
下一集,我們將會(huì)嘗試擴(kuò)展查詢狀態(tài)的功能,使之可以查詢Outlook Mobile里面的信息。
轉(zhuǎn)載于:https://www.cnblogs.com/allenlooplee/archive/2009/01/19/1378594.html
總結(jié)
以上是生活随笔為你收集整理的WM有约II(二):持续改进的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 正在使用.NET Framework 2
- 下一篇: 易借速贷好通过吗 个人资质好的一分钟可到