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