第2章 Windows Phone 7应用程序初探
2.1 第一个Windows Phone 7应用
2.1.1 项目创建和代码编写
经过第1章的介绍,我们对Windows Phone 7有了一个整体的认识,并且已经完成了环境的搭建,下面以一个简单的实例来具体介绍一下Windows Phone 7项目的创建和代码的编写。
首先打开Visual Studio 2010 Expression for Windows Phone,新建一个Project,如图2-1所示,选择Windows Phone Application,在Name栏中输入HelloPhone7,单击OK按钮。如图2-1所示。
图2-1 新建Windows Phone工程
这就是在Visual Studio中创建了一个名为HelloPhone7的Windows Phone 7工程项目,默认打开的这个MainPage.xaml就是默认生成的程序主页的布局描述文件。XAML是一种类XML语言,它使用标签化的语言来描述一个应用的UI元素布局,这既有利于逻辑层和展现层的分层管理,也有利于UI设计师与软件工程师的协作,UI设计师可以使用专门用于UI设计的Expression Blend软件来设计UI并保存为XAML文件,包括动画都可以在XAML中定义,通过Visual Studio可以直接导入设计完的XAML文件。软件工程师只需完成逻辑处理的代码即可。一般一个XAML文件会对应一个xaml.cs文件,用于实现页面的逻辑处理。例如,MainPage.xaml对应有一个MainPage.xaml.cs文件。图2-2展示了刚刚创建的项目中的XAML文件的内容。
图2-2 XAML页面
首先熟悉一下MainPage.xaml文件。在VisualStudio中使用设计界面(Design)和XAML两种展现方式,设计界面就是对XAML里的内容进行图形化的展示。我们来分析一下XAML文件的内容,前一部分是对命名空间的声明和一些属性的定义,如下面的代码所示,随着后续的学习将逐渐接触到这些命名空间,这里暂不赘述,而属性定义了对应类的名字、布局文件的设计宽度、布局文件的设计高度、字体样式等信息。其中shell:SystemTray.IsVisible="True"代码定义了是否显示系统托盘,系统托盘是指手机屏幕上端部分显示信号、电池电量等信息的状态栏。
1 <phone:PhoneApplicationPage 2 x:Class="HelloPhone 7.MainPage" 3 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 4 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 5 xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone" 6 xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone" 7 xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 8 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 9 mc:Ignorable="d" d:DesignWidth="480" d:DesignHeight="768" 10 FontFamily="{StaticResource PhoneFontFamilyNormal}" 11 FontSize="{StaticResource PhoneFontSizeNormal}" 12 Foreground="{StaticResource PhoneForegroundBrush}" 13 SupportedOrientations="Portrait" Orientation="Portrait" 14 shell:SystemTray.IsVisible="True">
中间部分是对页面进行布局的描述,这个页面使用一个Grid布局(可以称为表格布局),Grid布局将页面分成固定数量的格子,然后将控件布局到每个格子中,Windows Phone 7提供Stack、Grid、Canvas三种布局方式,第4章将具体介绍布局相关的内容。
从下面的代码中可以看到,MainPage中Grid分为两行,第一行中插入了一个叫做TitlePanel的StackPanel,第二行没有填充任何内容。StackPanel中包含两个TextBlock,一个用于显示ApplicationTitle,一个用于显示PageTitle,而每一个元素的属性如Text、Background都是对该元素的一个描述,相信很多做过Web编程或者开发过WPF应用的读者对这种标记性的描述非常熟悉,XAML与Web开发如出一辙,下面这段代码中其他的内容就不再赘述。
1 <!--LayoutRoot is the root grid where all page content is placed--> 2 <Grid x:Name="LayoutRoot" Background="Transparent"> 3 <Grid.RowDefinitions> 4 <RowDefinition Height="Auto"/> 5 <RowDefinition Height="*"/> 6 </Grid.RowDefinitions> 7 <!--TitlePanel contains the name of the application and page title-- 8 > 9 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28"> 10 <TextBlock x:Name="ApplicationTitle" Text="MY APPLICATION" 11 Style="{StaticResource PhoneTextNormalStyle}"/> 12 <TextBlock x:Name="PageTitle" Text="page name" Margin="9,-7,0,0" 13 Style="{StaticResource PhoneTextTitle1Style}"/> 14 </StackPanel> 15 16 <!--ContentPanel - place additional content here--> 17 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid> 18 </Grid>
最下面一部分默认被当做注释的代码是对菜单栏进行定义的代码,若取消注释,页面布局上即可显示相应的图标。Windows Phone 7将菜单分为两类,一类是在页面下无须展开就可以操作的图标,即下面代码中的ApplicationBarIconButton类;另一类是需要展开菜单才能看到的菜单项,即下面代码中的ApplicationBarMenuItem类。这两类的区别主要在于展现的样式和操作的方便程度,相对比较常用的操作应使用ApplicationBarIconButton类。而相对不常用的操作应使用ApplicationBarMenuItem类。但是微软对于Windows Phone 7中这两类菜单的菜单项个数有一定的规定,在Windows Phone 7 UI Design Specification中对ApplicationBarIconButton的建议是不超过4个,对ApplicationBarMenuItem的建议是不超过5个,否则将不符合Windows Phone 7的设计理念,专业的设计规范将在第7章讨论。
修改完成后,当前应用的运行效果如图2-3所示。
1 <phone:PhoneApplicationPage.ApplicationBar> 2 <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True"> 3 <shell:ApplicationBarIconButton 4 IconUri="/Images/appbar_button1.png" Text="Button 1"/> 5 <shell:ApplicationBarIconButton 6 IconUri="/Images/appbar_button2.png" Text="Button 2"/> 7 <shell:ApplicationBar.MenuItems> 8 <shell:ApplicationBarMenuItem Text="MenuItem 1"/> 9 <shell:ApplicationBarMenuItem Text="MenuItem 2"/> 10 </shell:ApplicationBar.MenuItems> 11 </shell:ApplicationBar> 12 </phone:PhoneApplicationPage.ApplicationBar>
图2-3 第一个应用运行效果
下面我们将ApplicationTitle的Text属性改为Windows Phone 7,将PageTitle的Text属性改为Hello Phone 7,修改Text属性可以通过在XAML文件中直接编辑Text属性对应的值,如:<TextBlock x:Name="ApplicationTitle" Text="Windows Phone 7";也可以在设计页面上选中需要修改的空间,在其属性窗口中修改,如图2-4所示,在属性窗口中列举了该控件的所有属性,在该窗口中切换事件(Event)标签可以查看该控件的所有事件,并可以编辑相应的事件处理函数。
图2-4 修改Text属性
然后在Grid的第二行插入一个TextBox控件、一个Button控件、一个TextBlock控件,分别命名为inputTextbox、OKButton、displayTextBlock,并修改OKButton的Content属性值为OK,布局的位置和控件的尺寸可以通过鼠标拖动调整。修改完成后的页面布局如图2-5所示。
图2-5 修改完成后的页面布局
双击OKButton即可创建Button的点击事件处理函数,之前我们介绍过,页面中的逻辑处理代码是放在MainPage.xaml.cs中的,所以OKButton的点击事件处理函数也是在MainPage.xaml.cs中定义的,MainPage.xaml.cs定义的类是HelloPhone命名空间下的MainPage,也和在MainPage.xaml中声明的x:Class="HelloPhone.MainPage"一致,在事件处理函数中我们定义一个简单的逻辑,将inputTextbox中的内容赋给displayTextBlock,只需输入代码“displayTextBlock.Text = inputTextbox.Text;”即可。
1 private void OKButton_Click(object sender, RoutedEventArgs e) 2 { 3 displayTextBlock.Text = inputTextbox.Text; 4 }
Visual Studio可以选择在模拟器上或是在手机设备上运行,在这里我们选择模拟器(Windows Phone 7 Emulator),如图2-6所示。然后单击三角箭头就可以在模拟器中运行我们刚才编写的应用程序,实际运行效果如图2-7所示。
图2-6 模拟器选择
图2-7 修改后的应用运行效果
至此我们就初步完成了一个最简单的Windows Phone 7应用程序的开发,也对Windows Phone 7的应用开发有了一个初体验,下面我们将一步一步深入地介绍Windows Phone 7应用程序开发的相关内容。