none
Windows Phone 7 开发话题讨论(五) Windows Phone 开发工具入门 RRS feed

全部回复

  • 推陈出新

    凭借 Windows Phone 7,Microsoft 改变了移动领域格局。除了能够阅读电子邮件和文档外,人们还期待手机能够成为生活中不可或缺的一部分。您可以通过手机听音乐、共享照片和视频,以及与朋友保持联络。显然,商业用户也对 Facebook 感兴趣,而青少年则热衷于浏览网站。我知道,这并不那么令人惊讶,但它确实反映出人们期望手机在生活中所起的角色正在发生转变。

    作为潜在客户,我希望您在看了 Belfiore 的演示后就有了购买手机的打算。更为重要的是,作为开发人员,我希望您对应用程序抱有更大的兴趣。毕竟,要在竞争激烈的移动市场中脱颖而出,仅仅开发一款新的操作系统是不够的。如果我们的前提是,用户希望手机能够将工作和个人生活以一种令人兴奋的全新方式融合在一起,那么,这将需要将该操作系统与能够实现此目标的卓越的应用程序构成生态系统相结合。

    我不会在手机的介绍上花费过多时间,因为我相信,您可以在喜好的博客上找到更详细的信息,相反,我会在您作为开发人员来说可能会遇到的两个主要问题上进行详细探讨:什么是 Windows Phone 7 的 Microsoft 应用程序平台,以及如何开始构建应用程序?


    Cedar
    2011年2月17日 6:41
    版主
  • 开发人员的新领域

    好吧,如果 MWC 只是为 Windows Phone 7 的推出开了个头,那么,游戏开发人员大会 (GDC) 和 MIX10 则使整个故事画上圆满的句号。在 GDC 和 MIX 上,Microsoft 宣布,Windows Phone 7 应用程序平台基于 Silverlight 和 XNA Framework。如果您过去进行过 Windows Mobile 的开发,那么就会知道这标志着与之前操作系统版本的本质区别。

    那么,为何要有所改变呢?在我看来,Microsoft 的强项在于其丰富的产品套件,在将这些产品结合在一起后,其获得了前所未有的成功。在 Windows Phone 7 之前,移动开发可能只是利用了部分 Microsoft 资产,远不及您现在所看到的那么多。

    XNA Framework 的设计初衷是要让开发人员能够开发出可以在桌面电脑、游戏机和手机上都比较耐玩且影响力大的 2D 和 3D 游戏。该框架围绕广泛的硬件集而设计,其中包括 Xbox 游戏机的图形功能和 Zune HD 的传感器和触摸功能。此外,其设计理念中还包括了联网游戏设置。

    Silverlight 是针对基于 Web 的媒体和高效率应用程序的 Microsoft 桌面平台。此平台在与 Expression Blend 结合使用时,可用于创建引人注目的 UI,此 UI 既可单独使用也可附加到 Web 服务中。

    XNA Framework 和 Silverlight 本身就是十分强健的平台。但在手机开发时将二者结合起来,则开发水平会达到全新的高度,这使得您可以开发出能够轻松利用移动设备功能并具有漂亮 UI 和出色图形的应用程序。

    正如我之前在 Windows Phone 7 开发周期中使用 Silverlight 和 XNA 应用程序时所体验到的那样,我很快就认定这是一个很好的发展方向。虽然我接触这两个平台以及托管代码的时间不长,但开发视觉效果超棒的应用程序时的速度之快让我印象深刻。

    这一全新应用程序平台的另一个值得关注的特性是,硬件标准化以及以编程方式对其进行访问的标准化。具体而言,另一个来自 MIX 的公告是, Windows Phone 将支持开发人员能够以统一和可靠的方式访问的一组核心硬件。为什么这很重要?以前,开发运行在多款手机上的应用程序比较困难,原因是最终必须要创建设备特定的应用程序版本。如果不进行大量的返工,一些手机将无法运行您的应用程序,或者,因为其不支持您的应用程序所需的功能而根本就不工作。

    使用 Windows Phone 7,您将不必考虑运行应用程序的手机是否支持位置服务这个问题了 — 所有手机都将支持位置服务。将不存在手机是否具有加速感应器以及您是否可以对其进行访问的问题 — 所有手机都将具备加速感应器,访问将是一致的。您将不必考虑手机是否支持触摸功能这个问题了 — 所有手机都将支持触摸功能,而且访问将是一致的。我不想过多解释,您应该明白我的意思了。

    通过 Windows Phone 7 应用程序平台,您将能够开发出单一的应用程序,并知晓在您的手机上测试的功能可以运行在所有手机上。Windows Phone 上仍会区分硬件,但还存在核心硬件基础,您的应用程序将能够依赖此基础运行。

    有关 Windows Phone 硬件和该应用程序平台的体系结构的详细信息,请参阅 MSDN 上有关该应用程序平台和硬件的概述:msdn.microsoft.com/library/ff402531(v=VS.92) msdn.microsoft.com/library/ff637514(v=VS.92)


    Cedar
    2011年2月17日 6:41
    版主
  • 入门

    好了,我们已经简要介绍了这一应用程序平台,现在,让我们来探讨下如何在其上进行开发吧。当前在 Beta 版中,可以从 Windows Phone 开发人员门户 (developer.windowsphone.com) 下载 Windows Phone 开发人员工具。如果没有安装 Visual Studio,开发人员工具会随 Visual Studio 2010 Express for Windows Phone 提供。如果安装了 Visual Studio 2010,该工具将直接与之集成。不管采取哪种方式,您都会具备针对 Windows Phone 7 进行开发所需的全部组件。

    开发人员工具包括 Windows Phone Emulator 和 Microsoft Expression Blend for Windows Phone。这不是最终版,但 Beta 版可以明确显示启动时您将具备的组件。您可能需要在 Beta 版与最终版工具之间对代码做出一些改动,但这些更改应当是轻微的,或者至少有完整的说明。

    我已经使用 Visual Studio 2010 Express for Windows Phone 安装了这些工具的 Beta 版,并将运用于以下示例中。如果希望从较为简单的教程开始,您可以查看 MSDN 上的“Windows Phone 入门指南”: msdn.microsoft.com/library/ff402529(v=VS.92)

    那么,创建什么呢?我知道,您迫切希望看到的是一般的“hello world”或“make that flashlight”应用程序,但是,在这里,我将与您分享我曾参与的一个有趣小项目的一部分。

    在 MIX,我碰巧参加了一个有关 Windows Azure 项目的讲座:Microsoft Codename “Dallas” (microsoft.com/windowsazure/dallas)。Dallas 基本上是一个市场,在这里有兴趣为其应用程序获取数据的开发人员和希望销售 Web 服务的提供商进行交易。该服务目前正处于第二个社区技术预览 (CTP) 阶段,您可以利用此在线门户和提供的一系列免费试用数据源对服务提供的内容进行体验。虽然当前的提供商还不是很多,但仍有许多东西值得一试。我个人发现,NASA 提供的有关火星任务的图像数据非常有趣,如果能创建出一个可以浏览火星漫游图片的 Windows Phone 应用程序,那感觉一定很棒。

    我必须提醒您,此处包含和提供下载的代码仅做示例之用,如果希望运行此代码,您需要注册 Dallas CTP 以获取帐户密钥和用户 ID,在我的代码中,这两项都是保留空白 (microsoft.com/windowsazure/developers/dallas)。


    Cedar
    2011年2月17日 6:42
    版主
  • 创建项目

    创建火星漫游图像查看器的第一步是创建一个 Windows Phone 应用程序项目。启动 Visual Studio 2010 for Windows Phone 的 Express 版本,您将看到一个标准的 Visual Studio 起始页。在此处,您可以选择“新建项目”,这将允许您从多个不同的项目模板中进行选择。如果只安装了 Windows Phone 开发人员工具,您的列表可能仅限于 Silverlight for Windows Phone 和 XNA Game Studio 4.0。

    我从 Silverlight 模板中选择了一个 Windows Phone 应用程序,并将我的项目命名为 MarsImageViewer。Visual Studio 将从此利用其神奇功能为您生成一个项目。

    如果之前使用过 Windows Presentation Foundation (WPF) 或 Silverlight,则您应该不会对看到的内容感到陌生。您会看到一个具有流行手机外观的设计图面、一个具有一些基本控件的工具箱以及多个具有其相关 C# 代码分离文件的 XAML 文件(参见图 1)。如果想了解基于 Windows 的 Silverlight 和 XNA 与基于 Windows Phone 的 Silverlight 和 XNA 的具体差异,可参阅 MSDN 上的“Windows Phone 框架概述”:msdn.microsoft.com/library/ff402528(v=VS.92)

    图 1 Visual Studio 中的初始 Windows Phone 项目


    Cedar
    2011年2月17日 6:42
    版主
  • 理解 XAML

    与使用 Silverlight 相同,Windows Phone 应用程序模板提供了一个 App.xaml 文件和一个 MainPage.xaml 文件,这是您的应用程序的核心。对此我将不再详述,因为它们与其 Silverlight 中的对应项的工作原理基本一样,但是,在继续创建应用程序之前,我要指出两个关键的不同之处。

    第一个不同之处在默认的 App.xaml 文件中。您会注意到,虽然自动生成的代码大部分与在桌面 Silverlight 项目中的一样,但其中有一部分包含了一个 PhoneApplicationService 对象:

    1. <shell:PhoneApplicationService
    2. Launching="Application_Launching" Closing="Application_Closing"
    3. Activated="Application_Activated" Deactivated="Application_Deactivated"/>

    在 Windows Phone 开发人员工具的 Bata 版中,有一个新的执行模型,用于支配应用程序的行为;这一标记部分以及 App.xaml.cs 中的隐藏代码是该模型与众不同之处之一。如果想更好地了解 Windows Phone 应用程序及该对象的行为,可参阅 MSDN 上的主题“Windows Phone 的执行模型”:msdn.microsoft.com/library/ff769557(VS.92)

    第二个不同之处在 MainPage.xaml 文件中,实际上就是我将要开始创建应用程序的地方。如果仔细看,该文件大部分与 Silverlight 类似,但对于菜单栏有一个注释掉的 XAML 部分。该菜单栏是一个系统控件,可用来公开按钮和菜单项。它不但可简化应用程序的创建,还有助于保持手机应用程序的一致性,因为其外观和行为与手机核心应用程序中使用的完全一样。我将修改此模板标记以创建我的菜单栏,您也可以使用 C# 为页面创建一个菜单栏(请参阅 msdn.microsoft.com/library/ff431786(VS.92) 以了解详细信息)。


    Cedar
    2011年2月17日 6:42
    版主
  • 创建菜单栏

    创建菜单栏的第一步是找到要使用的图标。您可以创建自己的图标,也可以选用开发人员工具附带的图标。默认情况下,可在 C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v7.0\Icons\(对于 64 位 Windows)和 C:\Program Files\Microsoft SDKs\Windows Phone\v7.0\Icons\(对于 32 位 Windows)找到包含的图标。这些图标确实值得选择,因为它们与手机的外观相匹配。

    在选取了所需的图像后,在您的项目中创建一个 Images 文件夹并将图标添加至其中。然后,设置每个图标的属性:“生成操作”应当是“内容”,“复制到输出目录”应当是“始终复制”,如图 2 所示。

    图 2 将图像资源添加至项目

    接下来,取消菜单栏标记的注释并针对您的应用程序进行修改。在本例中,必需的操作是创建两个按钮及其相关事件处理程序。具体而言,我创建了两个分别用于检索下一张和上一张照片的按钮。我还向 XAML 添加了一个单击事件并允许 Visual Studio 生成事件处理程序。菜单栏 XAML 现在看起来应当如图 3 中的代码所示。

    图 3 配置菜单栏

    1. <phone:PhoneApplicationPage.ApplicationBar>
    2. <shell:ApplicationBar
    3. IsVisible="True" IsMenuEnabled="False">
    4. <shell:ApplicationBarIconButton
    5. x:Name="appbar_BackButton"
    6. IconUri="/Images/appbar.back.rest.png"
    7. Text="Back"
    8. Click="appbar_BackButton_Click">
    9. </shell:ApplicationBarIconButton>
    10. <shell:ApplicationBarIconButton
    11. x:Name="appbar_ForwardButton"
    12. IconUri="/Images/appbar.
    13. next.rest.png"
    14. Text="Next"
    15. Click="appbar_ForwardButton_Click">
    16. </shell:ApplicationBarIconButton>
    17. </shell:ApplicationBar>
    18. </phone:PhoneApplicationPage.ApplicationBar>

    在开始关注隐藏代码之前,我还花了点时间指定了应用程序标题和页面名称,并向 MainPage.xaml 的根网格添加了图像控件,如图 4 所示。这应当使设计图面如图 5 所示,其中您会注意到一个由四个圆圈构成的空白菜单栏。

    图 4 MainPage.xaml

    1. <!--TitlePanel contains the name of the application and page title-->
    2. <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="24,24,0,12">
    3. <TextBlock x:Name="ApplicationTitle"
    4. Text="MarsImageViewer"
    5. Style="{StaticResource PhoneTextNormalStyle}"/>
    6. <TextBlock x:Name="PageTitle"
    7. Text="Images"
    8. Margin="-3,-8,0,0"
    9. Style="{StaticResource PhoneTextTitle1Style}"/>
    10. </StackPanel>
    11. <!--ContentPanel - place additional content here-->
    12. <Grid x:Name="ContentGrid" Grid.Row="1">
    13. <Image Height="300"
    14. HorizontalAlignment="Left"
    15. Margin="36,104,0,0"
    16. Name="MarsImage"
    17. Stretch="Fill"
    18. VerticalAlignment="Top"
    19. Width="400" />
    20. </Grid>

    图 5 配置好的设计图面

    定义了应用程序界面后,现在可以收集一些火星漫游图像。Dallas 门户设计初衷是方便用户使用,允许用户体验查询。它还为您提供适合的 Web 服务 URL,向您演示如何添加参数并为查询提供适当的标题信息。

    我通过该门户发现,NASA Web 服务允许基于参数的图像信息查询或通过图像 ID 检索特定的 JPEG 图像。对于此程序而言,这意味着以上两个操作都是必需的。首先,查询图像信息,信息中包含图像 ID。其次,分析针对这些图像 ID 返回的 XML,这些 ID 之后可用于检索特定图像。


    Cedar
    2011年2月17日 6:43
    版主
  • 叫休斯顿 ...我的意思是,Dallas

    下面我们就开始。在默认的 MainPage.xaml.cs 文件中,我为三个命名空间添加了 using 语句:

    1. using System.Xml.Linq;
    2. using System.IO;
    3. using System.Windows.Media.Imaging;

    然后,通过右键单击“解决方案管理器”中的“引用”、选择“添加引用”、选择“System.Xml.Linq”并单击“确定”,我添加了一个到 System.Xml.Linq DLL 的引用。通过 System.Xml.Linq,可以访问有助于从流加载 XML 而后通过 LINQ 查询该 XML 的类。如果您不熟悉 LINQ,不用担心;该示例使用了最少量的 LINQ to XML,您始终可以通过 MSDN 了解更多详细信息。

    我还为该页面创建了两个私有变量。IEnumerable of XElement 对象调用条目以存储 LINQ to XML 查询的结果,并调用一个整数索引以跟踪我关注的图片。然后,我修改了 MainPage 构造函数以将该索引初始化到 0 并调用一个 getImageIDs 函数:

    1. private IEnumerable<XElement> entries;
    2. private int index;
    3. // Constructor
    4. public MainPage() {
    5. InitializeComponent();
    6. index = 0;
    7. getImageIDs();
    8. }

    getImageIDs 函数旨在启动从 Web 服务检索图像信息。该函数使用 Web 服务 URL 和 WebClient 启动图像信息的异步请求:

    1. private void getImageIDs() {
    2. Uri serviceUri = new Uri("https://api.sqlazureservices.com/NasaService.svc/MER/Images?missionId=1&$format=raw");
    3. WebClient recDownloader = new WebClient();
    4. recDownloader.Headers["$accountKey"] = "<Your account key>";
    5. recDownloader.Headers["$uniqueUserID"] = "<Your user ID>";
    6. recDownloader.OpenReadCompleted +=
    7. new OpenReadCompletedEventHandler(recDownloader_OpenReadCompleted);
    8. recDownloader.OpenReadAsync(serviceUri);
    9. }

    您会注意到,为简便起见,我已经将 missionId 参数硬编码为 1,在本例中表示 Opportunity 任务。理想情况下,该参数和其他参数应当由用户动态定义。

    对于任何异步请求,您都需要一个处理程序。该处理程序会在数据请求完成时调用。然后,它将使用返回的流与一些基本的 LINQ to XML 访问返回的 XML 中的所有“条目”标记;“条目”是每个图像记录的开始标记:

    1. private void recDownloader_OpenReadCompleted(
    2. object sender, OpenReadCompletedEventArgs e) {
    3. if (e.Error == null) {
    4. Stream responseStream = e.Result;
    5. XNamespace ns = "http://www.w3.org/2005/Atom";
    6. XElement marsStuff = XElement.Load(responseStream);
    7. entries = marsStuff.Elements(ns + "entry");
    8. string imageID =
    9. (string)entries.ElementAt<XElement>(index).Element(
    10. ns + "title").Value;
    11. getImage(imageID);
    12. }
    13. }

    产生的集合将存储到 IEnumerable of XElement 对象(条目)中,我之前已对这些对象进行了声明。通过 LINQ to XML 的最终位,该处理程序之后将为条目中第一个 XElement 检索 title 标记的值。该 XML 架构中 title 标记的值碰巧与图像 ID 对应,该 ID 随后将传入 getImage 函数。

    getImage 函数类似于 getImageIDs 函数。唯一的区别是使用的 Web 服务 URL。该函数将流异步检索到由 ID 参数识别的图像。然后,其处理程序使用该流设置我在 MainPage.xaml 中定义的图片控件的源(参见图 6)。

    图 6 检索图像

    1. private void getImage(string ID) {
    2. Uri serviceUri = new Uri(
    3. "https://api.sqlazureservices.com/NasaService.svc/MER/Images/" +
    4. ID + "?$format=raw");
    5. WebClient imgDownloader = new WebClient();
    6. imgDownloader.Headers["$accountKey"] = "<Your account key>";
    7. imgDownloader.Headers["$uniqueUserID"] = "<Your user ID>";
    8. imgDownloader.OpenReadCompleted +=
    9. new OpenReadCompletedEventHandler(imgDownloader_OpenReadCompleted);
    10. imgDownloader.OpenReadAsync(serviceUri);
    11. }
    12. private void imgDownloader_OpenReadCompleted(
    13. object sender, OpenReadCompletedEventArgs e) {
    14. if (e.Error == null) {
    15. Stream imageStream = e.Result;
    16. BitmapImage imgsrc = new BitmapImage();
    17. imgsrc.SetSource(imageStream);
    18. MarsImage.Source = imgsrc;
    19. }
    20. }

    Cedar
    2011年2月17日 6:44
    版主
  • 扣上按钮

    这个时候,应用程序的剩余部分就非常简单了,只需要实现针对菜单栏按钮自动生成的事件处理程序即可。这些就是将要用于向前或向后浏览火星漫游图片的按钮。正如您所见,我基本上只是重用了 getImage 函数并添加了一些逻辑,以句柄方式更改条目集合中当前记录的索引。下面是后退按钮的处理程序:

    1. private void appbar_BackButton_Click(
    2. object sender, EventArgs e) {
    3. if (index > 0) {
    4. index--;
    5. XNamespace ns = "http://www.w3.org/2005/Atom";
    6. string imageID = (string)entries.ElementAt<
    7. XElement>(index).Element(ns + "title").Value;
    8. getImage(imageID);
    9. }
    10. }

    前进按钮处理程序完全一样,除了其索引:

    1. The forward button handler is pretty much the same, except for its indexing:
    2. if ((index + 1) < entries.Count<XElement>()) {
    3. index++;
    4. ...

    您现在可以使用包含的 Windows 仿真器运行该程序。从“标准”工具栏上的目标设备菜单选取 Windows Phone 7 Emulator。按 F5,程序生成并部署至该仿真器(参见图 7)。

    图 7 在仿真器中运行应用程序


    Cedar
    2011年2月17日 6:44
    版主
  • 准备启动

    该示例相对简单,但是我希望您通过它对于开发人员工具及其在将应用程序整合至 Windows Phone 方面的易用性能有个大致的了解。Windows Phone 7 可以带来很多可能性,建议您多花点时间仔细钻研一番。

    关于此应用程序平台的功能,您在此处的所见仅仅是窥豹一斑。我给出的简单应用程序即是证明。再使用一个按钮和大约 12 行代码,您就可以在 Microsoft.Xna.Framework.Media 命名空间使用 MediaLibrary 类,以将给定照片保存到媒体库中(参见 msdn.microsoft.com/library/ff769549(v=VS.92))。

    是的,没错 — 您可以从基于 Windows Phone Silverlight 的应用程序使用 XNA API。遗憾地是,有关应用程序中 Silverlight 和 XNA API 的相互交错,以及更多内容,只能留待日后再进行探讨了。更多深入的、针对性更强的文章、文档和示例,请访问 MSDN:msdn.microsoft.com/library/ff402535(v=VS.92)

    Joshua Partlow 是 Windows Phone 7 团队中的一名程序员。他为创建 Windows Phone 的 OEM 撰写手机启动流程、设备驱动程序开发和应用程序开发文档。


    Cedar
    2011年2月17日 6:44
    版主