zoukankan      html  css  js  c++  java
  • WM有约(一):你好,CF

    WM有约(一):你好,CF

    Written by Allen Lee

    来,和CF打个招呼!

    在这个系列里,我将会使用Visual Studio 2008来创建Windows Mobile 6 Professional应用程序,如果你也想在自己的计算机上体验一下,那么请先安装Visual Studio 2008和Windows Mobile 6 Professional SDK

    图 1

    创建一个新的项目,接着选择Visual C#\Smart Device\Smart Device Project项目模板,然后输入项目名称,最后单击OK打开Add New Smart Device Project对话框:

    图 2

    在Add New Smart Device Project对话框里,选择Windows Mobile 6 Professional SDK作为目标平台,选择.NET Compact Framework Version 3.5作为目标平台上运行的CF的版本,选择Device Application作为项目模板,单击OK完成项目的创建:

    图 3

    在继续之前,让我们先把目标设备设为Windows Mobile 6 Professional Emulator,把Form1的FormFactor属性设为Windows Mobile 6 Professional:

    图 4

    图 5

    好了,我们可以把目光投向Form1了。现在,把一个Label拖到Form1上,接着把它的Text属性设为"Hello, CF!",然后调整一下它的位置和对齐方式:

    图 6

    一切就绪之后,就可以单击Start Debugging了,此时,你会看到Deploy Alt对话框,请确保你所选择的是Windows Mobile 6 Professional Emulator,然后单击Deploy:

    图 7

    在部署Alt之前,Visual Studio 2008会检查目标设备上是否部署了.NET Compact Framework 3.5,如果没有,它会先部署.NET Compact Framework 3.5,再部署Alt。一切顺利的话,你将会看到运行在模拟器上的Alt:

    图 8

    等一下!谁要这种东西啊?

    那么,你想要的是什么?

    首先,把中间那个Label删除,在Form1的正中放一个MonthCalendar。接着,给Form1添加Pin和Save两个菜单项。我想要的界面大致如下:

    图 9

    当我选中某天并单击Pin时,MonthCalendar中的那天就会加粗;当我选中连续的几天并单击Pin时,MonthCalendar中的那几天都会加粗;而当我选中某个周六时,MonthCalendar中的那个周六及其相邻的周五和周日都会加粗。当我单击Save时,MonthCalendar中所有加粗的日期都会保存下来,每次启动应用程序时,保存的日期将会在MonthCalendar上加粗显示。

    钉住日期

    当选中的日期是周六时,我们可以计算它的前一天和后一天,接着把它们添加到某个用来储存选中日期的集合里,然后把这个集合里的日期关联到MonthCalendar的BoldedDates属性上:

    代码 1

    而对于另外两种情况,我们可以统一处理。当我们选中连续的几天时,MonthCalendar并非告诉我们具体是哪几天,而是通过SelectionStart和SelectionEnd两个属性告诉我们首尾两天,中间的日期需要我们自己计算。如果SelectionStart和SelectionEnd两个属性是同一天,那就意味着只选中一天。于是,我们可以这样:

    代码 2

    有了PinWeekend和PinRange两个方法,我们就可以处理Pin的Click事件了:

    代码 3

    保存选中的日期和读取保存的日期

    假设用来保存日期的文件和应用程序放在同一个文件夹里,那么我们可以通过下面代码获取文件的路径:

    代码 4

    要把一组日期保存到文件里,我们可以这样:

    代码 5

    而要读取文件里的日期,我们可以这样:

    代码 6

    那么,我们在什么时候调用这两个方法呢?我们知道,Form1上有一个Save菜单项,当用户单击这个菜单项的时候,我们应该调用SavePinnedDates方法:

    代码 7

    另外,当用户关闭应用程序时,我们也应该调用SavePinnedDates方法:

    代码 8

    你可能会问:"为什么不用Closing事件?"这是因为当我们单击窗体右上角的交叉时,应用程序实际上只是最小化到后台而不是关闭,此时触发的是Deactivate事件。

    至于日期的读取,我们可以在Form1的Load事件触发时执行:

    代码 9

    还差什么呢?嗯,或许你已经想到了,当应用程序第一次运行的时候,用来保存日期的文件并不存在,而此时应用程序却要从这个文件中读取数据,那将会引发异常。对于这个问题,我们有两个应对措施,一个是每次启动应用程序的时候检查这个文件是否存在,如果不存在就创建一个空白的文件;另一个是在应用程序的安装程序里包含一个空白的文件,安装应用程序的时候把这个文件一并安装到应用程序文件夹里。这两种方案各有利弊,这里我选择第一种方案(我这样做并没有什么特别的理由,只是想这样做而已):

    代码 10

    这个方法将会在Form1的构造函数里调用:

    代码 11

    模拟运行

    接下来就是在模拟器里运行这个应用程序,步骤大体上和前面的"Hello, CF!"类似,你要做的只是单击Start Debugging。噢,天哪,应用程序的主窗体都还没出来就抛了个异常:

    图 10

    原来,我没有释放InitializeFile方法里创建的文件,GC也没来得及帮我"擦屁股",所以当LoadPinnedDates方法试图读取文件的时候就出错了。知道问题的症结就好办了:

    代码 12

    重新执行调试,你将会看到应用程序的主窗体:

    图 11

    试一下钉住日期的功能:

    图 12

    基本上可以过关,但有一个小问题,就是最多只能连续选中7天,这个问题可以通过修改MonthCalendar的MaxSelectionCount属性来解决。

    单击Save之后,通过资源管理器找到PinnedDates.txt文件,用Word Mobile打开后可以看到选中的日期都保存下来了:

    图 13

    你还想要什么?

    "我不知道,但我随时都可能会有新的想法。"我不知道是否有办法在开始的时候就能收集到我的(绝)大部分需求,但相比之下,我更喜欢边做边用边修改的做法。我还想要什么呢?现在我的脑子里能想到的是:

    • 可以配置最大连续选择范围。
    • 可以配置允许选择的日期范围,比如说不能选择2008年10月17日之前的日期。
    • 过去的日期不能选择,比如说不能选择昨天。
    • 支持日期的排除,比如说2009年1月17日到2009年1月31日不能选。
    • (其它)

    下一集,我们将会探讨如何实现这些需求。

  • 相关阅读:
    48. Rotate Image
    47. Permutations II
    46. Permutations
    45. Jump Game II
    44. Wildcard Matching
    43. Multiply Strings
    42. Trapping Rain Water
    41. First Missing Positive
    40. Combination Sum II
    39. Combination Sum
  • 原文地址:https://www.cnblogs.com/allenlooplee/p/1352372.html
Copyright © 2011-2022 走看看