WM有约(二):配置信息

WM有约(二):配置信息

Written by Allen Lee

添加配置文件

首先,向项目添加一个Options.xml文件,这个文件将会用来储存应用程序的配置信息:

121308_1546_WM1.png

图 1

接着,把Options.xml的Copy to Output Directory属性的值改为Copy if newer:

121308_1546_WM2.png

图 2

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

121308_1546_WM3.png

代码 1

那么,我们如何使用这个文件呢?关于这个问题,我首先想到的是为它创建一个OptionManager类,在我的想象里,它应该是这样使用的:

121308_1546_WM4.png

代码 2

在继续之前,我想请你思考一个问题:你会如何实现OptionManager的Options成员呢?下面是我的做法,使用了单例模式和索引器:

121308_1546_WM5.png

代码 3

当然,你也可以学ConfigurationManager类那样,通过AppSettings静态属性返回一个NameValueCollection对象。接下来的问题是,如何访问Options.xml呢?由于Options.xml上面的配置信息实际上只是一组键/值对,于是你可以考虑在OptionManager的构造函数里把它们全部读到一个内部的Dictionary对象里:

121308_1546_WM6.png

代码 4

LoadOptions方法使用了LINQ to XML来读取Options.xml里的配置信息,并以Dictionary的形式返回:

121308_1546_WM7.png

代码 5

这里使用了GetXmlPath方法来获取Options.xml的路径:

121308_1546_WM8.png

代码 6

OptionManager提供了一个Save方法,用于保存配置信息:

121308_1546_WM9.png

代码 7

其中,SaveOptions方法也使用了LINQ to XML来构建并保存配置信息:

121308_1546_WM10.png

代码 8

最后就是OptionManager的索引器了:

121308_1546_WM11.png

代码 9

设计选项窗体

说到选项窗体,你会如何设计?我想象中的选项窗体大致像这样:

121308_1546_WM12.png

图 3

我用了一个NumericUpDown控件来收集MaxSelectionCount的配置信息,另外用了两个DateTimePicker控件分别收集MinDate和MaxDate的配置信息。

接着,我们来看看底下两个菜单项。Cancel菜单项比较简单,仅仅把窗体的DialogResult设为Cancel:

121308_1546_WM13.png

代码 10

而OK菜单项的任务就多一点,它要保存用户的配置信息:

121308_1546_WM14.png

代码 11

接着就是修改一下主窗体的菜单:

121308_1546_WM15.png

图 4

Save菜单项和以前一样,而Options菜单项将会打开选项窗体:

121308_1546_WM16.png

代码 12

现在,我们来运行一下这个应用程序:

121308_1546_WM17.png

图 5

121308_1546_WM18.png

图 6

有问题!选项窗体打开的时候,上面的控件没有反映配置文件里面的信息,这是因为我没有实现这样的逻辑,同样地,这个问题也会发生在主窗体身上,这意味着无论我们如何修改配置文件,重新启动应用程序之后,主窗体将会恢复默认配置,何等严重!

首先是选项窗体打开的时候需要读取配置信息到对应的控件上:

121308_1546_WM19.png

代码 13

121308_1546_WM20.png

代码 14

由于读取配置信息的代码和代码12里的那部分是相同的,所以我把它提取出来,放在SetupOptions方法里,这样,代码12就简化为:

121308_1546_WM21.png

代码 15

再次运行应用程序:

121308_1546_WM22.png

图 7

这次正常了。不过还有一个小问题,选项窗体里保存配置信息的代码属于OK菜单项而不是选项窗体的,当用户单击窗体右上角的OK按钮时,虽然窗体的DialogResult属性返回OK,但实质上没有执行任何保存配置信息的操作,这就导致了窗体行为的不一致。解决这个问题的办法有两个,一个是去掉窗体右上角的OK按钮,另一个是把OK菜单项里保存配置信息的代码放到窗体层面上做。前一种做法很简单,只需要把选项窗体的ControlBox属性设为false就行了。至于后一种做法,在继续讨论之前,我想先考一考你,我应该选择Deactivate事件还是Closing事件呢?答案是两个都可以,因为选项窗体是通过ShowDialog方法打开的,关闭这样的窗体是真的关闭了而不是像主窗体那样最小化到后台,所以我们可以放胆使用Closing事件:

121308_1546_WM23.png

代码 16

还有一个不是问题的问题,就是当你关闭选项窗体时,你会发现画面突然停顿,你知道这个时候OptionManager在保存配置信息,但用户并不知道,这可能会给用户留下不好的印象/感受,要让用户知道后台正在执行任务,最简单的办法就是在屏幕正中显示等待指针,当然,任务完成之后记得去掉等待指针,否则……

你还想要什么?

下一集,除了上一集剩下的两个需求之外,我们还会探讨两个新的需求:

  • 支持日期的包含,比如说2009年2月14日被指定为届时要选的日期。
  • 如果指定一个周期,应用程序将会综合排除逻辑、包含逻辑和这个周期计算下一个将要被选中的日期,并显示在主界面上。
Line 7618: 08-13 18:28:14.811241 1974 4159 I wm_create_activity: [0,165905532,106,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity,android.intent.action.MAIN,NULL,NULL,270532608] Line 7626: 08-13 18:28:14.909704 1974 2168 I am_proc_start: [0,29856,10052,com.aia.china.YoubangHealth,top-activity,{com.aia.china.YoubangHealth/com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity},NULL] Line 7629: 08-13 18:28:14.965942 1974 2344 I am_proc_bound: [0,29856,com.aia.china.YoubangHealth] Line 7633: 08-13 18:28:14.987052 1974 2344 I wm_restart_activity: [0,165905532,106,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity] Line 7634: 08-13 18:28:14.989719 1974 2344 I wm_set_resumed_activity: [0,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity,realStartActivityLocked - onActivityStateChanged] Line 7638: 08-13 18:28:16.340080 1974 3172 I wm_set_requested_orientation: [1,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity] Line 7640: 08-13 18:28:16.657950 29856 29856 I wm_on_create_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,performCreate,318] Line 7641: 08-13 18:28:16.678510 29856 29856 I wm_on_start_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,handleStartActivity,7] Line 7642: 08-13 18:28:16.790840 29856 29856 I wm_on_resume_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,RESUME_ACTIVITY,109] Line 7643: 08-13 18:28:16.823478 29856 29856 I wm_on_top_resumed_gained_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,topStateChangedWhenResumed] Line 7647: 08-13 18:28:16.975166 1974 2148 I wm_activity_launch_time: [0,165905532,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity,2170] Line 7668: 08-13 18:28:18.804182 1974 4128 I wm_create_activity: [0,133716422,106,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity,NULL,NULL,NULL,0] Line 7669: 08-13 18:28:18.805756 1974 4128 I wm_pause_activity: [0,165905532,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity,userLeaving=true,resumeTopActivity] Line 7670: 08-13 18:28:18.810853 1974 3402 I wm_finish_activity: [0,165905532,106,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity,app-request] Line 7671: 08-13 18:28:18.811308 29856 29856 I wm_on_top_resumed_lost_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,topStateChangedWhenResumed] Line 7672: 08-13 18:28:18.818301 29856 29856 I wm_on_paused_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,performPause,1] Line 7673: 08-13 18:28:18.818813 1974 4083 I wm_add_to_stopping: [0,165905532,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity,completeFinishing] Line 7674: 08-13 18:28:18.821025 1974 4083 I wm_restart_activity: [0,133716422,106,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity] Line 7675: 08-13 18:28:18.824206 1974 4083 I wm_set_resumed_activity: [0,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity,realStartActivityLocked - onActivityStateChanged] Line 7679: 08-13 18:28:18.843570 1974 4128 I wm_set_requested_orientation: [1,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity] Line 7681: 08-13 18:28:18.882033 29856 29856 I wm_on_create_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,performCreate,39] Line 7682: 08-13 18:28:18.885441 29856 29856 I wm_on_start_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,handleStartActivity,2] Line 7683: 08-13 18:28:18.888182 29856 29856 I wm_on_resume_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,RESUME_ACTIVITY,1] Line 7684: 08-13 18:28:18.897979 29856 29856 I wm_on_top_resumed_gained_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,topStateChangedWhenResumed] Line 7688: 08-13 18:28:18.968383 1974 2148 I wm_activity_launch_time: [0,133716422,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity,154] Line 7691: 08-13 18:28:19.252988 1974 2152 I wm_destroy_activity: [0,165905532,106,com.aia.china.YoubangHealth/.wellness_main.activity.WelcomeActivity,finish-imm:idle] Line 7694: 08-13 18:28:19.276781 29856 29856 I wm_on_stop_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,LIFECYCLER_STOP_ACTIVITY,3] Line 7695: 08-13 18:28:19.280232 29856 29856 I wm_on_destroy_called: [165905532,com.aia.china.YoubangHealth.wellness_main.activity.WelcomeActivity,performDestroy,3] Line 7707: 08-13 18:28:21.604693 1974 4083 I wm_finish_activity: [0,133716422,106,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity,app-request] Line 7712: 08-13 18:28:21.610657 1974 4083 I wm_pause_activity: [0,133716422,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity,userLeaving=false,finish] Line 7718: 08-13 18:28:21.629861 1974 4128 I wm_create_activity: [0,75435377,107,com.aia.china.YoubangHealth/.wellness_main.activity.OEMainActivity,NULL,NULL,NULL,268435456] Line 7720: 08-13 18:28:21.633982 29856 29856 I wm_on_top_resumed_lost_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,topStateChangedWhenResumed] Line 7721: 08-13 18:28:21.636161 29856 29856 I wm_on_paused_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,performPause,1] Line 7722: 08-13 18:28:21.636587 1974 3434 I wm_add_to_stopping: [0,133716422,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity,completeFinishing] Line 7723: 08-13 18:28:21.638225 1974 3434 I wm_restart_activity: [0,75435377,107,com.aia.china.YoubangHealth/.wellness_main.activity.OEMainActivity] Line 7724: 08-13 18:28:21.641500 1974 3434 I wm_set_resumed_activity: [0,com.aia.china.YoubangHealth/.wellness_main.activity.OEMainActivity,realStartActivityLocked - onActivityStateChanged] Line 7727: 08-13 18:28:21.655705 1974 4128 I wm_set_requested_orientation: [1,com.aia.china.YoubangHealth/.wellness_main.activity.OEMainActivity] Line 7730: 08-13 18:28:21.766830 29856 29856 I wm_on_create_called: [75435377,com.aia.china.YoubangHealth.wellness_main.activity.OEMainActivity,performCreate,112] Line 7732: 08-13 18:28:21.896982 29856 29856 I wm_on_start_called: [75435377,com.aia.china.YoubangHealth.wellness_main.activity.OEMainActivity,handleStartActivity,129] Line 7733: 08-13 18:28:21.929620 29856 29856 I wm_on_resume_called: [75435377,com.aia.china.YoubangHealth.wellness_main.activity.OEMainActivity,RESUME_ACTIVITY,32] Line 7734: 08-13 18:28:21.946160 29856 29856 I wm_on_top_resumed_gained_called: [75435377,com.aia.china.YoubangHealth.wellness_main.activity.OEMainActivity,topStateChangedWhenResumed] Line 7740: 08-13 18:28:22.386141 1974 2148 I wm_activity_launch_time: [0,75435377,com.aia.china.YoubangHealth/.wellness_main.activity.OEMainActivity,760] Line 7747: 08-13 18:28:22.729392 1974 2152 I wm_destroy_activity: [0,133716422,106,com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity,finish-imm:transit] Line 7750: 08-13 18:28:22.876435 29856 29856 I wm_on_stop_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,LIFECYCLER_STOP_ACTIVITY,1] Line 7751: 08-13 18:28:22.886759 29856 29856 I wm_on_destroy_called: [133716422,com.aia.china.YoubangHealth.wellness_main.activity.AdvActivity,performDestroy,4] Line 7752: 08-13 18:28:22.895064 1974 3848 I wm_task_removed: [106,106,0,removeChild, last child = ActivityRecord{7f859c6 u0 com.aia.china.YoubangHealth/.wellness_main.activity.AdvActivity t-1 f}} in Task{226c68 #106 type=standard A=10052:com.aia.china.YoubangHealth}] Line 7769: 08-13 18:28:25.811530 1974 3465 I am_proc_died: [0,29856,com.aia.china.YoubangHealth,0,2] Line 7771: 08-13 18:28:25.852458 1974 3465 I wm_finish_activity: [0,75435377,107,com.aia.china.YoubangHealth/.wellness_main.activity.OEMainActivity,proc died without state saved] Line 7772: 08-13 18:28:25.862547 1974 3465 I wm_task_removed: [107,107,0,removeChild, last child = ActivityRecord{47f0d71 u0 com.aia.china.YoubangHealth/.wellness_main.activity.OEMainActivity t-1 f}} in Task{9260fad #107 type=standard A=10052:com.aia.china.YoubangHealth}] Line 7817: 08-13 18:28:38.887267 1974 3660 I am_stop_idle_service: [10052,com.aia.china.YoubangHealth/com.alipay.pushsdk.push.NotificationService]感觉这段日志莫名奇妙的,帮我看看 com.aia.china.YoubangHealth的生命周期有什么异样
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值