WM有約(一):你好,CF

WM有約(一):你好,CF

 

Written by Allen Lee

 

來,和CF打個招呼!

在這個系列裏,我將會使用Visual Studio 2008來創建Windows Mobile 6 Professional應用程序,如果你也想在自己的計算機上體驗一下,那麼請先安裝Visual Studio 2008和Windows Mobile 6 Professional SDK

121008_1548_WMCF1.png

圖 1

創建一個新的項目,接着選擇Visual C#/Smart Device/Smart Device Project項目模板,然後輸入項目名稱,最後單擊OK打開Add New Smart Device Project對話框:

121008_1548_WMCF2.png

圖 2

在Add New Smart Device Project對話框裏,選擇Windows Mobile 6 Professional SDK作爲目標平臺,選擇.NET Compact Framework Version 3.5作爲目標平臺上運行的CF的版本,選擇Device Application作爲項目模板,單擊OK完成項目的創建:

121008_1548_WMCF3.png

圖 3

在繼續之前,讓我們先把目標設備設爲Windows Mobile 6 Professional Emulator,把Form1的FormFactor屬性設爲Windows Mobile 6 Professional:

121008_1548_WMCF4.png

圖 4

121008_1548_WMCF5.png

圖 5

好了,我們可以把目光投向Form1了。現在,把一個Label拖到Form1上,接着把它的Text屬性設爲"Hello, CF!",然後調整一下它的位置和對齊方式:

121008_1548_WMCF6.png

圖 6

一切就緒之後,就可以單擊Start Debugging了,此時,你會看到Deploy Alt對話框,請確保你所選擇的是Windows Mobile 6 Professional Emulator,然後單擊Deploy:

121008_1548_WMCF7.png

圖 7

在部署Alt之前,Visual Studio 2008會檢查目標設備上是否部署了.NET Compact Framework 3.5,如果沒有,它會先部署.NET Compact Framework 3.5,再部署Alt。一切順利的話,你將會看到運行在模擬器上的Alt:

121008_1548_WMCF8.png

圖 8

等一下!誰要這種東西啊?

 

那麼,你想要的是什麼?

首先,把中間那個Label刪除,在Form1的正中放一個MonthCalendar。接着,給Form1添加Pin和Save兩個菜單項。我想要的界面大致如下:

121008_1548_WMCF9.png

圖 9

當我選中某天並單擊Pin時,MonthCalendar中的那天就會加粗;當我選中連續的幾天並單擊Pin時,MonthCalendar中的那幾天都會加粗;而當我選中某個週六時,MonthCalendar中的那個週六及其相鄰的週五和週日都會加粗。當我單擊Save時,MonthCalendar中所有加粗的日期都會保存下來,每次啓動應用程序時,保存的日期將會在MonthCalendar上加粗顯示。

 

釘住日期

當選中的日期是週六時,我們可以計算它的前一天和後一天,接着把它們添加到某個用來儲存選中日期的集合裏,然後把這個集合裏的日期關聯到MonthCalendar的BoldedDates屬性上:

121008_1548_WMCF10.png

代碼 1

而對於另外兩種情況,我們可以統一處理。當我們選中連續的幾天時,MonthCalendar並非告訴我們具體是哪幾天,而是通過SelectionStart和SelectionEnd兩個屬性告訴我們首尾兩天,中間的日期需要我們自己計算。如果SelectionStart和SelectionEnd兩個屬性是同一天,那就意味着只選中一天。於是,我們可以這樣:

121008_1548_WMCF11.png

代碼 2

有了PinWeekend和PinRange兩個方法,我們就可以處理Pin的Click事件了:

121008_1548_WMCF12.png

代碼 3

 

保存選中的日期和讀取保存的日期

假設用來保存日期的文件和應用程序放在同一個文件夾裏,那麼我們可以通過下面代碼獲取文件的路徑:

121008_1548_WMCF13.png

代碼 4

要把一組日期保存到文件裏,我們可以這樣:

121008_1548_WMCF14.png

代碼 5

而要讀取文件裏的日期,我們可以這樣:

121008_1548_WMCF15.png

代碼 6

那麼,我們在什麼時候調用這兩個方法呢?我們知道,Form1上有一個Save菜單項,當用戶單擊這個菜單項的時候,我們應該調用SavePinnedDates方法:

121008_1548_WMCF16.png

代碼 7

另外,當用戶關閉應用程序時,我們也應該調用SavePinnedDates方法:

121008_1548_WMCF17.png

代碼 8

你可能會問:"爲什麼不用Closing事件?"這是因爲當我們單擊窗體右上角的交叉時,應用程序實際上只是最小化到後臺而不是關閉,此時觸發的是Deactivate事件。

至於日期的讀取,我們可以在Form1的Load事件觸發時執行:

121008_1548_WMCF18.png

代碼 9

還差什麼呢?嗯,或許你已經想到了,當應用程序第一次運行的時候,用來保存日期的文件並不存在,而此時應用程序卻要從這個文件中讀取數據,那將會引發異常。對於這個問題,我們有兩個應對措施,一個是每次啓動應用程序的時候檢查這個文件是否存在,如果不存在就創建一個空白的文件;另一個是在應用程序的安裝程序裏包含一個空白的文件,安裝應用程序的時候把這個文件一併安裝到應用程序文件夾裏。這兩種方案各有利弊,這裏我選擇第一種方案(我這樣做並沒有什麼特別的理由,只是想這樣做而已):

121008_1548_WMCF19.png

代碼 10

這個方法將會在Form1的構造函數裏調用:

121008_1548_WMCF20.png

代碼 11

 

模擬運行

接下來就是在模擬器裏運行這個應用程序,步驟大體上和前面的"Hello, CF!"類似,你要做的只是單擊Start Debugging。噢,天哪,應用程序的主窗體都還沒出來就拋了個異常:

121008_1548_WMCF21.png

圖 10

原來,我沒有釋放InitializeFile方法裏創建的文件,GC也沒來得及幫我"擦屁股",所以當LoadPinnedDates方法試圖讀取文件的時候就出錯了。知道問題的癥結就好辦了:

121008_1548_WMCF22.png

代碼 12

重新執行調試,你將會看到應用程序的主窗體:

121008_1548_WMCF23.png

圖 11

試一下釘住日期的功能:

121008_1548_WMCF24.png

圖 12

基本上可以過關,但有一個小問題,就是最多隻能連續選中7天,這個問題可以通過修改MonthCalendar的MaxSelectionCount屬性來解決。

單擊Save之後,通過資源管理器找到PinnedDates.txt文件,用Word Mobile打開後可以看到選中的日期都保存下來了:

121008_1548_WMCF25.png

圖 13

 

你還想要什麼?

"我不知道,但我隨時都可能會有新的想法。"我不知道是否有辦法在開始的時候就能收集到我的(絕)大部分需求,但相比之下,我更喜歡邊做邊用邊修改的做法。我還想要什麼呢?現在我的腦子裏能想到的是:

  • 可以配置最大連續選擇範圍。
  • 可以配置允許選擇的日期範圍,比如說不能選擇2008年10月17日之前的日期。
  • 過去的日期不能選擇,比如說不能選擇昨天。
  • 支持日期的排除,比如說2009年1月17日到2009年1月31日不能選。
  • (其它)

下一集,我們將會探討如何實現這些需求。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章