1.4 第一个Silverlight for Windows Phone应用程序
以下过程演示Silverlight for Windows Phone应用程序的创建过程,并测试应用程序的运行。同时,还详细介绍了Silverlight for Windows Phone应用程序的构成结构,以及主要程序文件的作用。
1.4.1 创建第一个应用程序
在Windows操作系统中,选择“开始”→“所有程序”→“Microsoft Visual Studio 2010 Express”→“Microsoft Visual Studio 2010 Express for Windows Phone”命令,启动如图1-13所示的开发工具。
图1-13 Microsoft Visual Studio 2010 Express for Windows Phone开发工具
1.新建应用程序项目
在“Start Page”页上,单击“New Project…”或者选择“File”→“New Project…”命令。在如图1-14所示的新建工程“New Project”窗口中,在左侧项目模板选择“Other Languages” →“Visual Basic”,然后在中间的项目模板列表中选择“Windows phoneApplication”,设置项目名称为“GuessNumber”,并指定项目文件存放的路径。单击“OK”按钮,创建新应用程序项目。
图1-14 新建工程
2.选择Windows phonePlatform
在如图1-15所示的窗口中,选择目标Windows phone操作系统为Windows phoneos7.1。单击“OK”按钮,进入项目设计窗口,如图1-16所示。
图1-15 选择“Windows phoneOS7.1”操作系统
图1-16 设计窗口
项目设计窗口分为3部分。左侧是可视化的模拟器预览窗口,可以通过图形方式查看和设计Windows phoneMango应用程序的界面效果。中间是代码编辑窗口,在此窗口中可以查看和编辑XAML代码,这些代码用于定义Windows phoneMango应用程序的界面与行为效果。模拟器预览窗口和代码编辑窗口是联动的,在模拟器预览窗口中对Windows phoneMango应用程序的界面进行修改时,对应的XAML代码会反映到代码编辑窗口中,反之亦然。右侧是解决方案(Solution Explorer)与属性(Properties)窗口,解决方案窗口(Solution Explorer)可以管理项目中的所有文件,单击底部的“Class View”,可以切换到类视图窗口,可以查看本项目引用和生成的类;属性(Properties)窗口可以设置和查看项目中各种对象的属性。
3.修改程序主窗口页面标题
在解决方案窗口(Solution Explorer)中双击MainPage.xaml文件,打开该文件。在代码编辑窗口中,修改名称为“PageTitle”的TextBlock控件的Text值为“Guess Number”。在左侧的模拟器预览窗口中可以看到页面标题相应地由“PageTitle”改为“Guess Number”。
4.修改页面内容
找到“<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>”,并将之修改为如下所示代码。
XAML代码:
<StackPanel Grid.Row="1" Name="ContentPanel" Orientation="Horizontal" Height="80" HorizontalAlignment="Center"> <Button Name="GuessButton1" Content="Guess1" Tag="1"/> <Button Name="GuessButton2" Content="Guess2" Tag="2"/> <Button Name="GuessButton3" Content="Guess3" Tag="3" /> </StackPanel>
完成后,完整的XAML代码如下。
XAML代码:
<phone:PhoneApplicationPage x:Class="GuessNumber.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True"> <!--LayoutRoot is the root grid where all page content is placed--> <Grid x:Name="LayoutRoot" Background="Transparent"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition Height="*"/> </Grid.RowDefinitions> <!--TitlePanel contains the name of the application and page title--> <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="Guess Number" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel> <!--ContentPanel-place additional content here--> <StackPanel Grid.Row="1" Name="ContentPanel" Orientation="Horizontal" Height="80" HorizontalAlignment="Center"> <Button Name="GuessButton1" Content="Guess1" Tag="1"/> <Button Name="GuessButton2" Content="Guess2" Tag="2"/> <Button Name="GuessButton3" Content="Guess3" Tag="3" /> </StackPanel> </Grid> </phone:PhoneApplicationPage>
左侧模拟器预览窗口显示的效果如图1-17所示。
5.添加页面加载事件
在模拟器预览窗口中,双击空白区域,或者在属性(Properties)窗口中,保持对象名称为“PhoneApplicationPage”,选择“Events”项(即事件)。在事件列表中,选中“Loaded”,然后双击右侧的空白单元格,一个名称为“PhoneApplicationPage_Loaded”的事件会被添加,如图1-18所示。Microsoft Visual Studio 2010 Express for Windows Phone会在程序代码编辑窗口中打开MainPage.xaml.vb文件,这是MainPage.xaml对应的程序代码文件,如图1-19所示。
图1-17 模拟器预览窗口显示的效果
图1-18 属性窗口中添加页面加载事件
图1-19 程序代码编辑窗口
6.添加程序代码
在如图1-19所示的程序代码编辑窗口中,找到代码“Public Sub New()”,并在此之前,添加如下代码,定义两个页面可用的公共变量。
VB.NET代码:
Dim GuessNumber As Integer Dim rnd As Random
找到步骤5中生成的PhoneApplicationPage_Loaded事件,修改代码如下。
VB.NET代码:
Private Sub PhoneApplicationPage_Loaded(sender As System.Object,e As System.Windows.RoutedEventArgs)Handles MyBase.Loaded rnd=New Random(System.DateTime.Now.Second) GuessNumber=rnd.Next(1,3) End Sub
7.添加按钮事件及处理代码
在如图1-19所示窗口中,单击代码编辑窗口顶部的“MainPage.xaml”标签,切换到页面设计窗口。双击模拟器预览窗口中的“GuessButton1”按钮(即显示内容为“Guess1”的按钮),系统会为按钮添加“GuessButton1_Click”事件,并跳转到程序代码编辑窗口。
修改按钮的事件处理代码如下。
VB.NET代码:
Private Sub GuessButton1_Click(sender As System.Object,e As System.Windows.RoutedEventArgs)Handles GuessButton3.Click,GuessButton1.Click,GuessButton2.Click Dim button As Button=CType(sender,Button) If GuessNumber=CInt(button.Tag)Then MessageBox.Show("哈哈,真厉害,这也让您猜到了!","结果",MessageBoxButton.OK) GuessNumber=rnd.Next(1,3) Else MessageBox.Show("哦,喔喔!没猜到!再试试!","结果",MessageBoxButton.OK) End If End Sub
1.4.2 测试应用程序
完成后的应用程序可以在模拟器中(Windows phoneEmulator)进行测试,也可以部署到实体手机上进行测试。一般,在开发阶段以模拟器测试为主,在工具栏中选择“Select target for Windows phoneprojects”项为“Windows phoneEmulator”,即在模拟器上运行Windows phone应用程序。
单击工具栏中的“Save All”按钮,保存上述设计内容。单击工具栏中“Start Debugging(F5)”按钮,或直接按“F5”键,测试应用程序。系统会启动“Windows phoneEmulator”,并打开应用程序,如图1-20所示。
在模拟器中,单击“Guess1”、“Guess2”、“Guess3”各按钮,测试程序运行情况,可以得到如图1-21所示的各种情况。
图1-20 模拟器Windows phoneEmulator运行应用程序
提示:
Windows phoneEmulator模拟器在程序调试过程中,最好不要关闭,这样可以节约模拟器的启动时间。为了便于书籍印刷,在后续实例测试时,模拟器的Theme背景会修改为Light,这样模拟器的背景是白色显示的。为适应白色背景,应用程序背景与文字颜色等也进行了相应调整。
图1-21 程序运行情况
1.4.3 Silverlight for Windows Phone应用程序分析
1.Silverlight for Windows Phone应用程序结构
从文件结构来看,一个Visual Basic.NET语言开发的Silverlight for Windows Phone的应用程序一般都包含App.xaml、App.xaml.vb、ApplicationIcon.png、Background.png、MainPage.xaml、MainPage.xaml.vb、SplashScreenImage.jpg和My Project、References等文件与文件夹。其中,My Project文件夹中还包含AppManifest.xml、AssemblyInfo.vb、WMAppManifest.xml等文件,References文件夹包含对系统类与用户自定义的引用。
这些文件在应用程序中的作用与含义分别如下。
1)App.xaml/App.xaml.vb
App.xaml/App.xaml.vb定义了一个继承自Application的类,此类是Silverlight 应用程序所必需的,它定义了程序的入口点、程序范围可用的资源等。
默认的App.xaml如下。
XAML代码:
<Application x:Class="GuessNumber.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"> <!--Application Resources--> <Application.Resources> </Application.Resources> <Application.ApplicationLifetimeObjects> <!--Required object that handles lifetime events for the application--> <shell:PhoneApplicationService Launching="Application_Launching" Closing="Application_Closing" Activated="Application_Activated" Deactivated="Application_Deactivated"/> </Application.ApplicationLifetimeObjects> </Application>
在上述代码中,x:Class="GuessNumber.App"告诉系统定义了一个App类型的类,类的名称为GuessNumber。这个类的定义代码在App.xaml.vb代码中,从App.xaml.vb代码中可以看到App继承自Application,即应用程序类。Xmlns标记定义应用程序用到的XML名称空间,如xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"表示引入Silverlight标准名称空间,其中包含了常用的Grid、Button、TextBlock等控件。<Application.Resources>与</Application.Resources>节点间,可以定义在整个应用程序范围内可用的资源,如样式、图片、模板等。<Application.ApplicationLifetimeObjects>与</Application.ApplicationLifetimeObjects>间的代码定义了应用程序生命周期内的事件绑定,如Launching="Application_Launching"和Closing="Application_Closing"分别表示为应用程序启动时,载入Application_Launching,关闭时执行Application_Closing,Application_Launching和Application_Closing的执行代码可以在App.xaml.vb中进行定义。
2)ApplicationIcon.png
ApplicationIcon.png是一个图标文件。应用程序在模拟器中调试时,此图标会出现在模拟器的应用程序列表中,部署到实体手机时同样会出现在手机应用程序的列表中。ApplicationIcon.png的默认图标如图1-22所示,大小为62像素×62像素,如本例“GuessNumber”在模拟器应用程序列表中的显示效果如图1-23所示,这是系统默认提供的图标。
图1-22 ApplicationIcon.png图标
图1-23 应用程序列表中显示的图标
用户可以根据需要修改ApplicationIcon.png,最简单的方式是采用同名文件覆盖系统默认的ApplicationIcon.png文件,另一种方式是修改WMAppManifest.xml中的相关定义,详见WMAppManifest.xml。
3)Background.png
Background.png也是个图标文件。与ApplicationIcon.png不同的是,Background.png将会出现在模拟器或手机的开始页中(如果用户将程序钉到开始页)。Background.png的默认图标如图1-24所示,大小为173像素×173像素,本例“GuessNumber”在开始页中显示效果如图1-25所示。
图1-24 Background.png图标
图1-25 开始页中显示的图标
用户同样可以自定义Background.png,修改方式与ApplicationIcon.png类似。
4)MainPage.xaml/MainPage.xaml.vb
MainPage是应用程序用户页,MainPage.xaml用XAML代码定义了要在程序中显示的界面,可以将Grid、Button、TextBlock、ListBox等定义在XAML代码中。MainPage.xaml.vb是与MainPage.xaml对应的程序代码文件。在Silverlight for Windows Phone应用程序设计中,页面设计与程序代码设计是可以分别进行的,页面设计师可以设计页面,并将最终结果以XAML文件的形式提交,而程序员可以专注于代码设计,最终代码形成.vb文件。这种可视界面与程序代码独立设计的方式,可以充分发挥设计师和程序员各自的特长。
在MainPage.xaml中,默认包含如下代码:
FontFamily="{StaticResource PhoneFontFamilyNormal}" FontSize="{StaticResource PhoneFontSizeNormal}" Foreground="{StaticResource PhoneForegroundBrush}" SupportedOrientations="Portrait" Orientation="Portrait" shell:SystemTray.IsVisible="True">
前3项定义了页面整体的字型、字体大小、前景色,这些项的值绑定了系统资源(或样式)PhoneFontFamilyNormal、PhoneFontSizeNormal、PhoneForegroundBrush。这些资源(或样式)是Silverlight for Windows Phone为方便用户程序设计预先设置的,比较符合Windows Phone运行环境,用户可以根据需要调用,详情请见“第5章 资源样式与模板”。SupportedOrientations="Portrait" Orientation="Portrait"定义了应用程序在屏幕上放置的效果,SupportedOrientations="Portrait"表示应用程序支持竖屏显示,SupportedOrientations还可以取其他值,取值及含义如表1-2所示。Orientation项多用于设计时模拟器预览窗口显示的效果。
表1-2 SupportedOrientations的取值及含义
shell:SystemTray.IsVisible="True",此代码定义了系统状态栏的显示状态,在Windows phoneMango中,系统状态栏是指位于屏幕顶部,用于显示通信信号强度、电池容量、响铃(或振动)、WIFI连接情况等状态。设置值为“True”可以显示状态栏,设置为“False”可以隐藏状态栏。
另外,MainPage.xaml默认定义如下代码:
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" Style="{StaticResource PhoneTextNormalStyle}"/> <TextBlock x:Name="PageTitle" Text="Guess Number" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/> </StackPanel>
分别用于显示应用程序标题和页面标题,可以通过修改Text值进行定制。
系统默认以MainPage.xaml作为应用程序运行的首页面,在实际使用中可以进行更改。事实上,应用程序中也可以没有MainPage.xaml文件。这些修改需要在WMAppManifest.xml文件中完成。
5)SplashScreenImage.jpg
SplashScreenImage.jpg是个图片文件,默认图片如图1-26所示。该图片会在应用程序启动,但尚未载入首页面(如MainPage.xaml)之前显示。同样与Background.png和ApplicationIcon.png类似,用户也可以修改该图片。
图1-26 SplashScreenImage.jpg
6)AppManifest.xml
AppManifest.xml是Silverlight应用程序的基础结构文件,保存的是应用程序生成时所必需的文件清单,一般不需要手工改动。
7)AssemblyInfo.vb
AssemblyInfo.vb文件记录了应用程序生成时的元数据,包括程序的名称、版本、企业、版权所有方等信息。这些元数据会嵌入到最终生成的Xap文件中。如在本例中,AssemblyInfo.vb文件的内容如下。
VB.NET代码:
Imports System Imports System.Reflection Imports System.Runtime.InteropServices Imports System.Resources ' Review the values of the assembly attributes <Assembly: AssemblyTitle("GuessNumber")> <Assembly: AssemblyDescription("")> <Assembly: AssemblyConfiguration("")> <Assembly: AssemblyCompany("Guess Corp.")> <Assembly: AssemblyProduct("GuessNumber")> <Assembly: AssemblyCopyright("Copyright © Guess Corp.2010")> <Assembly: AssemblyTrademark("")> <Assembly: AssemblyCulture("")> <assembly: ComVisible(false)> ' The following GUID is for the ID of the typelib if this project is exposed to COM <assembly: Guid("f1b1febc-3400-4f4f-a40b-f00e14551236")> <assembly: AssemblyVersion("1.0.0.0")> <assembly: AssemblyFileVersion("1.0.0.0")> <Assembly: NeutralResourcesLanguageAttribute("zh-CN")>
这些内容也可以通过项目属性进行修改,操作过程如下:在解决方案管理器窗口中,用鼠标右键单击项目名称,如本例的“GuessNumber”,在弹出快捷菜单中选择“Properties”(属性)命令。在如图1-27所示的窗口单击“Assembly Information…”按钮,可以在如图1-28所示的“Assembly Information”对话框中,设置应用程序生成的元数据信息。这些数据变动会实时更新到AssemblyInfo.vb文件中。
图1-27 “GuessNumber”窗口
图1-28 “Assembly Information”对话框
8)WMAppManifest.xml
WMAppManifest.xml用于应用程序在操作系统Windows phoneMango中的运行方式、显示状态,是应用程序的清单。如本例“GuessNumber”项目的WMAppManifest.xml内容如下:
<?xml version="1.0" encoding="utf-8"?> <Deployment xmlns="http://schemas.microsoft.com/windowsphone/2009/deploy ment" AppPlatformVersion="7.1"> <App xmlns="" ProductID="{91b9b9f0-67bd-4be6-83d9-358561e38f4f}" Title="GuessNumber" RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal" Author="GuessNumber author" Description="Sample description" Publisher="Gu essNumber"> <IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</I conPath> <Capabilities> <Capability Name="ID_CAP_GAMERSERVICES"/> <Capability Name="ID_CAP_IDENTITY_DEVICE"/> <Capability Name="ID_CAP_IDENTITY_USER"/> <Capability Name="ID_CAP_LOCATION"/> <Capability Name="ID_CAP_MEDIALIB"/> <Capability Name="ID_CAP_MICROPHONE"/> <Capability Name="ID_CAP_NETWORKING"/> <Capability Name="ID_CAP_PHONEDIALER"/> <Capability Name="ID_CAP_PUSH_NOTIFICATION"/> <Capability Name="ID_CAP_SENSORS"/> <Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/> <Capability Name="ID_CAP_ISV_CAMERA"/> <Capability Name="ID_CAP_CONTACTS"/> <Capability Name="ID_CAP_APPOINTMENTS"/> </Capabilities> <Tasks> <DefaultTask Name="_default" NavigationPage="MainPage.xaml"/> </Tasks> <Tokens> <PrimaryToken TokenID="GuessNumberToken" TaskName="_default"> <TemplateType5> <BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImageURI> <Count>0</Count> <Title>GuessNumber</Title> </TemplateType5> </PrimaryToken> </Tokens> </App> </Deployment>
其中,ProductID是在Windows Phone操作系统用于标识该应用程序的GUID(Globally Unique Identifier)编号,这是全局唯一的编号,可以与其他程序进行区分。Title项值代表应用程序的名称,RuntimeType可识别应用程序的类型,值“Silverlight”表示这是一个Silverlight程序,如果值是“XNA”则表示是一个XNA程序。另外,<IconPath IsRelative="true" IsResource="false"> ApplicationIcon.png</IconPath>指定了应用程序的图标,<DefaultTask Name="_default" NavigationPage="MainPage.xaml"/>指定应用程序启动时载入的首页面为“MainPage.xaml”,<BackgroundImageURI IsRelative="true" IsResource="false">Background.png</BackgroundImage URI>指定了应用程序在操作系统开始页中的图标。因此,修改这些项的值,可以定制应用程序的运行状态。
WMAppManifest.xml文件与应用程序属性是相关联的,也就是说,可以通过对应用程序属性的修改来更改WMAppManifest.xml中的内容。具体可以在如图1-27所示的窗口中进行操作。
2.代码含义
本程序代码比较简单,也易懂,程序代码都集中在MainPage.xaml.vb中。完整代码及说明如下。
VB.NET代码:
Partial Public Class MainPage Inherits PhoneApplicationPage '定义两个页面级公共变量 Dim GuessNumber As Integer Dim rnd As Random Public Sub New() InitializeComponent() End Sub Private Sub PhoneApplicationPage_Loaded(sender As System.Object,e As System.Windows.RoutedEventArgs)Handles MyBase.Loaded '页面载入时,调用随机函数,生成随机值,随机值取值范围为1~3,整型值,然后赋给'页面全局变量GuessNumber rnd=New Random(System.DateTime.Now.Second) GuessNumber=rnd.Next(1,3) End Sub '将3个按钮的单击事件都绑定到GuessButton1_Click,并判断所单击按钮值是否与'GuessNumber值相同,并根据结果给出提示 Private Sub GuessButton1_Click(sender As System.Object,e As System.Windows.RoutedEventArgs)Handles GuessButton3.Click,GuessButton1.Click,GuessButton2.Click Dim button As Button=CType(sender,Button) If GuessNumber=CInt(button.Tag)Then MessageBox.Show("哈哈,真厉害,这也让您猜到了!","结果",MessageBoxButton.OK) GuessNumber=rnd.Next(1,3) Else MessageBox.Show("哦,喔喔!没猜到!再试试!","结果",MessageBoxButton.OK) End If End Sub End Class