创建 Pocket TaskVision 应用程序

概述

TaskVision 是一个用 .NET Framework 的 Windows 窗体类构建的示例智能客户端任务管理应用程序 — 一个不可或缺的 Windows 组件,它支持构建和运行下一代的应用程序和 Web 服务。TaskVision 使经身份验证的用户查看、修改和添加与其他用户共享的项目和任务。它可用于多种解决方案 — 从错误跟踪到管理工作单或客户服务请求。它的主要目的是为有兴趣用 .NET Framework 构建智能客户端应用程序和 Web 服务的开发人员提供高品质的示例源代码。

Pocket TaskVision 应用程序是 TaskVision 解决方案的一个扩展,它使用户能够在连接或断开连接的环境中使用 Pocket PC 设备管理任务。它和 TaskVision 应用程序使用相同的 Web 服务:身份验证服务(用于对用户进行身份验证)和数据服务(用于管理任务)。SQL CE 用于在脱机工作时进行本地存储。图 1 显示了一个概述。

wnf_pkttaskvision_01

图 1 Pocket TaskVision 应用程序概述

您可以访问 TaskVision 和 Pocket TaskVision,网址是 TaskVision 主页。您在安装完这两个应用程序中的任一个后,可以使用以下凭据登录并访问该应用程序的功能:

用户名:jdoe

密码:welcome

功能子集

Pocket TaskVision 支持 TaskVision 功能的一个子集。它允许用户在联机或脱机模式下管理任务,但不允许他们管理项目(例如,创建新项目)或管理用户(例如,从数据库中删除一个特定用户)。它支持以下功能:

  • 在使用 .NET Compact Framework 的 Pocket PC 设备上运行。

  • 管理任务:查看、修改、删除和创建新任务。

  • 使您能够联机或脱机工作。选择进行脱机的项目,然后在 Internet 连接可用时使更改同步。

  • 在脱机工作时使用 SQL CE 进行本地存储。

  • 解决冲突:允许用户指定当同一任务经多个用户修改时将什么信息保留到数据库中。

  • 使用本地配置文件存储设置和默认值。

  • 提供一个 Pocket PC 友好的自定义任务列表控件。

  • 筛选任务列表。

  • 提供一个用于输入任务日期的自定义 DateTimePicker 控件。

  • 通过执行异步 Web 服务方法保持使用主数据库更新任务列表。

类概述

类分成四个主要类别,如图 2 所示。

  • Window 窗体为用户收集并显示信息。

  • 自定义控件是窗体上的单个控件元素,派生于 System.Windows.Forms.Control 类。

  • 数据访问包含负责存储和管理数据的类;该数据的源可以是 Web 服务或本地 SQL CE 数据库。

  • 最后,Util 类提供多种功能,例如,管理配置文件中的设置、加密密码以及与 Web 服务进行交互。

wnf_pkttaskvision_02

图 2 Pocket TaskVision 应用程序的类的类别

 

UI 差异

Pocket TaskVision 与 TaskVision 之间的明显区别是,Pocket TaskVision 运行在较小的显示界面上,它的屏幕设计为用在具有不同长宽比(长度比宽度大)的较小屏幕上。

选项卡控件

选项卡通过将相关内容分组到不同选项卡下,允许在单个窗口中显示更多信息。例如,Pocket TaskVision 在具有“Local and Server”选项卡的选项卡式窗口中显示数据冲突信息(图 3)。

wnf_pkttaskvision_03

图 3 显示数据冲突
显示列表

.NET Compact Framework 支持 DataGridListView 控件,但它们一直不是最佳的选择,因为它们强制用户水平滚动。Pocket TaskVision 则使用一个名为 TaskListControl 的自定义列表控件,该控件在每行中显示几行信息,而且只是垂直滚动(图 4)。

wnf_pkttaskvision_04

图 4 使用自定义 TaskListControl 显示任务
自定义控件

TaskListControl 是自定义控件的一个示例。自定义控件是派生于能够实现一个控件所有方面的 System.Windows.Forms.Control 的类。例如,自定义列表控件可以存储任务列表、绘制每个任务项、突出显示行以及执行点击测试,等等。因为 .NET Compact Framework(它对某些东西完全支持,对某些东西完全不支持)不允许您自定义标准控件的绘制,所以在 Pocket PC 上创建自定义控件是更为常见的。

.NET Compact Framework 也不支持允许您启用双缓冲并忽略清除背景消息的 Control.SetStyle 方法。而这两种功能在创建无闪烁控件时是很重要的。Pocket TaskVision 对自定义控件采用了以下通用设计模式:

  • 检测第一次绘制。创建一个与该控件以及进行绘图所需的 GDI 对象(刷子、画笔和字体)大小一致的内存位图。与在每个绘制事件中创建 GDI 对象相比,这提供了更好的性能。

  • 重写 OnPaint 并在内存位图上绘制,然后将该位图绘制到屏幕上。这被称为双缓冲并可以防止闪烁。

  • 重写 OnPaintBackground 以防止 Windows 清除背景并引起闪烁。

反馈

同样的操作在 Pocket PC 所花的时间比在桌面系统上所花的时间多,因此提供适当的反馈是很重要的。Pocket TaskVision 在繁忙时显示等待光标,显示用于其他反馈的自定义进度控件,以及在适当的情况下显示登录事件。请看 图 5。

wnf_pkttaskvision_05

图 5 显示已更新信息的反馈
窗体

.NET Compact Framework 中的所有窗口都是全屏的,但有时您想使用弹出对话框。当用户在任务列表(图 6)中指定自定义筛选器时,Pocket TaskVision 会显示一个弹出窗口。该对话框与您在桌面应用程序中使用的弹出对话框不同;它是一个通过隐藏和显示来模拟弹出对话框的面板控件。

wnf_pkttaskvision_06

图 6 使用面板控件显示弹出窗口

为了获得更好的性能,您还可以隐藏和显示全部窗体,而不用每次都创建并初始化窗体。Pocket TaskVision 创建一次任务列表窗口,然后会更改可视状态,而不会实际关闭该窗口。

此外,在首次需要对象的实例时创建对象的实例(而不是假设应该在窗体加载中创建它们)可以提高性能。每个对象实例化都要花一定的时间,而所有对象的组合对于窗体来说在加载时所花的累计时间就明显多了。如果窗体进行加载时所花的时间过长,您可以强制它立即显示,以便让用户感觉时间没那么长。

不受支持的控件

并不是所有的控件在 .NET Compact Framework 中都可用。DateTimePicker 控件就是个例子。基础操作系统支持该控件,但 .NET Compact Framework 不提供它的类。这是 Pocket TaskVision 的一个重要 UI 元素,因此创建了 DataTimePicker 控件的一个纯托管版本(图 7)。

wnf_pkttaskvision_07

图 7 显示 DateTimePicker 控件
最大限度地减少键盘输入

Pocket TaskVision 尽可能避免键盘输入。它在适当的情况下使用下拉列表,并且通过将值存储在配置文件中记住值。存储和恢复的一些值有:登录名和密码、诸如服务位置和超时的设置、最后选定项目和任务筛选器选择。在创建新任务时,Pocket TaskVision将前一个新任务使用的值作为默认值。例如,如果您将最后一个任务分配给了 Bob Smith,它就会为您选择他。

.NET Compact Framework 缺少配置文件支持,因此 Pocket TaskVision 使用向标准配置文件读写设置的自定义设置类。在将敏感性数据(例如,登录密码)存储到配置文件中之前,要对其进行编码。

上下文菜单非常易于挂钩到窗体或控件,而且可用于减少键入。例如,Pocket TaskVision 包含 Last Location 上下文菜单,允许用户快速指定最后一个 Web 服务位置,而不用重新键入它。


 

存储数据

TaskVision 和 Pocket TaskVision 都可工作在连接或断开连接的环境中。这两者运行在联机模式中时都从 Web 服务访问数据,但是在脱机工作时有所不同:TaskVision 使用本地文件,而 Pocket TaskVision 使用 SQL CE 数据库进行本地存储。

DataSet 方法 ReadXmlWriteXml 可以用在 Pocket PC 上,但您在处理较大的数据集时会注意到性能问题;因此 Pocket TaskVision 使用 SQL CE 数据库。有关何时使用 SQL CE 并没有定义固定的规则;它取决于数据量、数据关系、查询类型、更新频率等因素。

访问联机和脱机数据

该数据的位置对 UI 代码来说是透明的。例如,该 UI 请求一个项目列表,但是它不知道该列表是借助 Web 服务从远程数据库获得的,还是从位于本地设备上的 SQL CE 数据库获得的。该 UI 代码中没有一处类似“if online do this, otherwise do this”这样的代码。

Pocket TaskVision 代码包含一个 IDataAccess 接口,该接口定义数据访问接口以及用于实现该接口的两个类:DataOnlineDataOfflineDataOnline 使用 Web 服务访问数据,而 DataOffline 使用本地 SQL CE 数据库访问数据,如下面的图 8 所示。

wnf_pkttaskvision_08

图 8 数据的位置对 UI 代码来说是透明的
使用 SQL CE

本地 SQL CE 数据库在用户脱机工作时用于进行临时存储。该数据库被认为是按需要创建和销毁的数据文件,而不是永久数据库;例如,该数据库在用户脱机处理项目时动态创建(表和索引),在项目与主数据库同步后删除。这减少了应用程序所需的存储量。

数据连接保持打开有助于获得更好的性能。连接只打开一次,然后在应用程序终止时关闭,而不会针对每个查询打开连接,执行 SQL 命令,然后关闭连接。SQL CE 只允许一个到数据库的连接,因此试图打开一个已打开的连接会引发异常。

查询返回 DataSet 对象,而不是更高性能的 DataReader 对象。这要归因于数据存储封装设计。Web 服务返回 DataSet 中的数据,以便从本地存储返回的数据以相同的对象类型返回。


 

使用 Web 服务

Pocket TaskVision 使用的 Web 服务与 TaskVision 所使用的相同。身份验证服务对用户进行身份验证,而数据服务处理项目和任务。大多数 Web 服务调用是同步执行的,而任务列表是通过进行异步服务调用保持更新的。异步调用运行在单独的线程上;而当调用处于活动状态时,UI 较少作出响应。

数据集

.NET Compact Framework 的序列化支持很有限,因此这意味着它在使用类型化 DataSet 时会遇到麻烦。当对 Web 服务进行 Web 引用时,Visual Studio .NET 会生成代理类。TaskVision 数据服务包含类型化的 DataSet,而 Visual Studio 使用大量序列化代码生成代理类。在项目进行编译之前,需注释掉该代码。开发人员需要了解这一点,这样,当他们添加了包含类型化 DataSet 的 Web 引用后发现项目没有进行编译时,就不会感到惊讶了。

对于使用 DataSet 的 Web 服务,在使用时会造成性能的些微降低。这里的瓶颈是 .NET Compact Framework 填充了 DataSet 对象。对于 Pocket TaskVision 来说,性能不再是问题了,因为它在联机模式下一次只处理一个任务,而在脱机工作时执行批量更新。您可通过数组(而不是 DataSet)的形式传递数据,以获得更高的性能。

设置

用户可以从“设置”窗口指定 Web 服务的位置和超时值(图 9)。这些设置存储在本地配置文件中,因此在下次启动应用程序时,它们可以得到恢复。

wnf_pkttaskvision_09

图 9 “设置”窗口

 

重用代码

TaskVision 和 Pocket TaskVision 在 Web 服务级重用代码;不同的客户端使用相同的 Web 服务。您可以通过在条件编译指令中包装任何桌面或 Pocket PC 特定代码,在源代码级重用代码。例如, DataSet.GetChanges 在 .NET Compact Framework 中不受支持,因此您需要手动为 Pocket PC 项目实现该功能。


 

调试

调试类似于桌面应用程序,而且可选择使用仿真程序或真正的 Pocket PC 设备。调试器运行得较慢,因此它在调试 Pocket PC 应用程序(而不是桌面应用程序)时,要花费更多的时间来检查 DataSet 对象的所有属性。

Localhost

Web 服务不在 Pocket PC 上运行,因此请确保您没有为服务 URL 路径指定 localhost。您应该使用服务器名或 IP 地址。

Smart-minimize

Pocket PC 支持 smart-minimize,该功能隐藏应用程序,而不是关闭它们。窗体的 MinimizeBox 属性定义是否使用 smart-minimize:选择 true 来使用 smart-minimize(默认),或者选择 false 来终止应用程序。在调试时关闭 smart-minimize 是很有用的,因为如果不是这样的话,进程就无法终止。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-157120/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/12639172/viewspace-157120/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值