直接下水
正如学习游泳应该下水尝试一下,而不是坐在教室里看书,学习 Windows Phone 7 开发技术也应该亲身实践一下,而不是仅仅翻阅资料。那么,怎样实践呢?不必想得太复杂,这里所说的实践就是找个需求实现一下。那么,找个什么需求来实现呢?也不必想得太复杂,作为一名程序员,我们每天都在帮助别人实现需求,可我们自己的需求呢?千万别告诉我你没有需求哦!想象一下,当你拿到一个 Windows Phone 7 手机,你会希望它为你做点什么特别的事?从这点出发,发挥你的想象力,你应该能找到一个起点的,比如说,写个课程表应用。
有了需求,很自然就想寻找实现需求的工具,说到这里,你可能马上想到价格不菲的Visual Studio 2010 和Expression Studio 4,有的话当然是好,没有的话也不用担心,因为微软提供了免费的 Expression Blend 4 for Windows Phone 和 Visual Studio 2010 Express for Windows Phone ,足以应付常见的 Windows Phone 7 开发需求了。装好开发环境之后,可以做个 Hello World 试一下,就像图 1 这样:
图 1
很多人觉得 Hello World 太过简单以至于不屑一顾,我不是这么想的,我认为 Hello World 的价值之一在于用最简单的方式验证开发环境是否成功安装和正确设置,而这正是后续故事得以展开的基准点。
在开发 Windows Phone 7 的应用时,我喜欢用 Expression Blend 来设计用户界面,然后用 Visual Studio 来编写内部逻辑。Expression Blend 提供了丰富的设计体验,其中一个我最喜欢的特性是设计时数据的支持,你可以按照图 2 所示的方式从 XML 文件里导入现有的数据:
图 2
然后通过拖放把数据绑定到控件上,如图 3 所示:
图 3
此外,你也可以让 Expression Blend 为你自动生成设计时数据。当你在 Expression Blend 里设计好用户界面之后,就可以在 Visual Studio 里为控件编写事件处理程序了。如果你在 Expression Blend 的 Options 里设置了"使用 Visual Studio 创建和编辑事件处理程序的代码",如图 4 所示:
图 4
那么当你在图 5 所示 Expression Blend 的 Properties 面板上双击控件事件旁边的编辑框时,Visual Studio 会打开对应的代码文件,并定位到对应的事件处理程序,如果该事件处理程序还没有,Visual Studio 会为你创建一个。当然,如果你比较极客,喜欢手工编写 XAML,那么 Visual Studio 基本上已经可以满足你的所有需求了。
图 5
应用的开发和测试是密不可分的,当你想运行并测试应用时,就轮到 Windows Phone 7 模拟器出场了,图 6 像你展示了我们的程序在模拟器中运行的样子:
图 6
你还可以通过 Visual Studio 在模拟器里调试你的应用。不过,这个模拟器只支持系统自带的软键盘输入,你无法通过电脑的键盘进行输入,这会为输入测试数据造成一些不便。
善用资源
虽然 Expression Blend 和 Visual Studio 已经提供了很多 Windows Phone 7 控件,但这显然无法满足日益增长的需求,于是微软发布了 Silverlight for Windows Phone Toolkit ,通过附带的示范程序(如图 7 所示),你可以感受一下这些组件能够实现什么功能和效果:
图 7
最新版本是 Feb 2011,里面包含了以下组件:
- AutoCompleteBox
- ContextMenu
- DatePicker
- GestureService/GestureListener
- ListPicker
- LongListSelector
- Page Transitions
- PerformanceProgressBar
- TiltEffect
- TimePicker
- ToggleSwitch
- WrapPanel
如果你在使用期间遇到一些奇怪的问题,请别急着自己解决,先看看别人是否也遇到这些问题,另外,你也可以看看是否有人提交了相关的补丁,除非你一眼就能看出问题所在,或者你享受解决问题的过程。我在使用LongListSelector 控件时就遇到一个奇怪的问题,我在一个页面上使用这个控件,里面显示一组作业,然后通过新的页面来新建和编辑作业,每当我从新的页面返回时,LongListSelector 控件都无法显示刚才新建的作业或者更新的内容,经过一番调查,我最后发现LongListSelector 控件没有考虑到打开新的页面这种情况。当我们打开新的页面时,Windows Phone 7 为了节约资源会把原来那个页面卸载(unload);而当我们从新的页面返回时,布局系统会重新计算并构建原来那个页面,这会导致LongListSelector 控件在子元素的处理上出现错误(这个问题在最新的Feb 2011 版本里也没得到修复)。从这里我们不难看出,虽然Windows Phone 7 的应用属于本地应用,但它和我们平时接触到的Windows 应用程序是不同的,你需要搞清楚页面的生命周期以及页面的导航是如何工作的,除非你的应用只有一个页面。
此外,微软也提供了适用于Windows Phone 7 的 Prism ,如果你打算在 Windows Phone 7 应用里使用 MVVM 模式,那么 Prism 里面提供的一些类型就会帮上忙。当然,你也可以选择其它 MVVM 框架,比如说, MVVM Light Toolkit ,还有 Caliburn Micro 。类库和框架固然能够节省一定的工作量,但如果你想切实地提高自己的能力,那么需要的就是知识和技术,你可以读一读微软发布的《Windows Phone 7 Developer Guide》(英文)和《Windows Phone 7 开发者培训包》(中文),你也可以上 Windows Phone 7 Development Best Practices Wiki 看看别人有什么最佳实践,吸取一下别人的经验。如果你有些问题确实不知道怎么处理,还可以试着到 App Hub 的论坛或者博客园的博问上问一问。
技术之外
如果你希望写个好的应用,那么仅仅关注技术方面的内容是不够的,你需要把应用看做一组完整的用户体验,然后站在用户的角度考虑每个细节。
举个例子吧,你认为图8 中的页面设计有没有问题?
图8
没有,一切看起来都是那么正常,至少表面上确实如此,用户可以完成相关的操作,页面的相关功能也没有bug,可是,在图9 中你会看到,每次输入完毕之后都不能直接关闭页面,因为确定按钮被软键盘挡住了:
图9
要想关闭页面,用户就需要先单击页面空白处关闭软键盘,然后才能单击确定按钮关闭页面。你觉得这是不是一个问题呢?我在测试这个应用的时候,一开始只是觉得有点儿麻烦罢了,但当我重复这个过程大概十次之后,我就开始痛恨这个多余的步骤,并且深深地体会到这个小小的细节为用户体验带来了多么糟糕的影响!于是,在开发后续的功能时,我尝试了新的设计,用Application Bar 按钮替代传统按钮,就像图10 中显示的这样:
图10
这样,用户在输入完毕之后马上可以单击确定,这个小小的改动使得整个操作体验变得更加平滑、流畅。
再举一个例子吧,你觉得图11 中的页面设计有没有问题?
图11
这是一个支持通过标签进行筛选的笔记应用,上面显示当前标签,单击这个控件将会打开一个新的页面,用户可以在新的页面里选择其它标签,下面显示根据当前标签筛选的笔记。还是那句老话,这个设计很正常,用户照样可以完成相关的操作,那么,还有什么需要修改的吗?试想一下,既然这是一个关于笔记的应用,那么它的主要任务自然就是显示笔记内容,而笔记标签作为一种辅助的手段,不应该占用本来就不多的手机屏幕空间,它应该在用户需要的时候才出现。为此,我修改了页面的设计,使显示笔记内容的ListBox 占满页面可用空间,然后把显示笔记标签的ListBox 隐藏在屏幕下方,修改后的程序运行效果如图12 所示。
图12
当用户单击Application Bar 上的按钮时,显示笔记标签的ListBox 将会从屏幕下方外面向上平移。这样,应用就可以最大限度地利用有限的屏幕空间来完成最重要的任务了。
很久之前,我看过一部电影,名字叫做《和你在一起》,里面有个情节至今仍然历历在目,余教授在听完他的学生拉的小提琴之后对这个学生说:"都对,就是不好,你的音乐没有感情,没有感情的音乐怎么感染听众?"现在的用户对于品质的要求越来越高,他们不再仅仅因为你正确地实现了他们的需求就选择你的应用,他们更加重视你是否切身处地的为他们设想、考虑他们的感受,因为选择是有成本的,他们一旦选择了你的应用,他们就需要尝试适应你的应用,因此他们会评估这样的付出是否值得。下次,当你打算开发一个应用时,不妨问一下自己:凭什么你的应用值得用户选择?
着眼未来
去年Windows Phone 7 首次发布时,有人戏说它是2007 年水平的iPhone,潜台词当然是指它和当年的iPhone 一样退化为单任务方式,比较讽刺的是,当微软信心满满地解释不支持多任务是为了保证电池的续航性时,苹果宣布iOS 支持多任务了,尽管那还不是真正的多任务。然而,正当Windows Phone 7 的开发者学习如何处理单任务方式导致的各种问题并为之而发愁时,微软又宣布Windows Phone 的后续版本将会支持真正的多任务。如果你希望你的应用在支持多任务的Windows Phone 手机上有出色的表现,你现在就要把它考虑进你的设计里了。
为Windows Phone 7 开发应用还有一个广受关注的问题–应用的部署。在Windows Phone 7 之前,我们可以自行制作CAB 安装包,然后把它复制到手机上安装,可惜,这种情况在Windows Phone 7 上不复存在,因为微软决定Windows Phone 7 的应用必须通过Marketplace 部署。此外,如果你想在真机上测试你的应用,你需要注册成为Windows Phone 7 的开发者并交纳99 美元的会费(目前中国大陆的开发者还不能直接注册),否则你无法把你的应用部署到真机上。为了解决这个问题, Long Zheng、Rafael Rivera 和 Chris Walsh 一同发布了一款名为"ChevronWP7"的 Windows Phone 7 手机开发者解锁工具:
图 13
随后,微软与Windows Phone 7 破解团队ChevronWP7 进行了会晤,共同探讨ChevronWP7 解锁工具的官方化,我相信他们的合作会为我们开发者提供更多部署的选择。
经常留意业界动态,及时学习所需知识,合理利用各种资源,综合考虑不同因素,这些都是开发一个好的应用必不可少的,然而,如果没有踏踏实实地踏出第一步,一切都是空谈,因此,最终我们又回到了最初的问题:学习Windows Phone 7 开发技术应该亲身实践一下。
感谢侯伯薇对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家加入到 InfoQ 中文站用户讨论组中与我们的编辑和其他读者朋友交流。
评论