上一个篇博文说了WinPhone页面内部的东西,现在介绍表面的东西,先来看看一下一个WinPhone页面

这个页面分了三部分:顶部这个是状态栏,

中间这个是一个页面的内容部分,

最下面则是应用程序栏

本篇的页面解剖第一个要介绍的就最底下的应用程序栏,再去讲将中间页面内容的部分。

应用程序栏

  说这个应用程序栏我就联想起其余两个系统的界面

  在iOS中,由于只有”home”键,像Androd中的返回键,Menu键都没有了,所以类似的操作只能放到标题栏上面去,

这里除了放后退操作的按钮,还有其他功能按钮。回到WinPhone中,WinPhone没有标题栏搁这些按钮,所以WinPhone设立了ApplicationBar(应用程序栏),原本标题栏上面的一些按钮可以放到ApplicationBar上面。像这样

  在Android中有Menu键,每个页面需要有更多的操作可以在Menu里获更多的功能选项

在WinPhone中解决这个问题的也是ApplicationBar,

那么现在说说这个ApplicationBar的建立,如果用XAML建立的话,可以使用以下的代码

     <phone:PhoneApplicationPage.ApplicationBar>
<shell:ApplicationBar Mode="Minimized">
<!--这里是Icon Buttonb部分-->
<shell:ApplicationBarIconButton IconUri="/Image/ApplicationBar.Check.png" Text="btn1"/>
<!--这里是Menu Item部分-->
<shell:ApplicationBar.MenuItems>
<shell:ApplicationBarMenuItem Text="Item1"/>
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>

  ApplicationBar有几个比较有用的属性

  • Mode:指定第一次显示在页面上时应用程序栏的大小:默认大小或最小大小。但是在支持横向的页面上,当为横向时,无论模式值如何,应用程序栏都使用默认大小显示,目的是提高可用性。
  • Opacity:预期的值介于 0.0 和 1.0 之间。
  • IsMenuEnabled:指示当用户扩展应用程序栏时是否可以看到菜单项。
  • IsVisible:指示应用程序栏是否可见。

当然如果要让每个按钮点击之后又对应的事件处理,那就得加上Click事件。

如果用代码建立的话,那在页面构造函数中InitializeComponent()方法后加入下面的代码

             ApplicationBar = new ApplicationBar();
ApplicationBarIconButton barIconBnt = new ApplicationBarIconButton();
barIconBnt.IconUri = new Uri("~/Image/ApplicationBar.Check.png", UriKind.Relative);
barIconBnt.Text = "barIconBnt";
ApplicationBar.Buttons.Add(barIconBnt); ApplicationBarMenuItem barMenuItm = new ApplicationBarMenuItem();
barMenuItm.Text = "barMenuItm";
ApplicationBar.MenuItems.Add(barMenuItm);

上面的代码中首先构造了一个新的ApplicationBar到ApplicationBar的属性中,后来加入了一个IconButton,后来再加了一个MenuItem,这些也是如控件设置的一般,既然是控件设置,那对ApplicationBar可以动态修改。

  在设计ApplicationBar时,IconButton的数量个人认为不适宜多于4个,这不清楚在别的分辨率下是如何一种情况,但在我的WVGA下,多于4个就容纳不下了。如果在建立MenuItem时,文本的最大长度是14 到 20 个字符,不然会超出屏幕范围,而MenuItem的数量就不适宜多于4个,否则会会强制用户进行滚动。IconButton的图标的图片大小应为48x48像素,可与来自于C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Icons

页面布局

  在设计一个页面设计时肯定会用到布局,在WinPhone中用到布局分了两大类:绝对布局和动态布局,而这两种布局用到的控件分别有以下三种Canvas(用于绝对布局),StackPanel(动态布局),Grid(动态布局)。下面再介绍两种布局以及三种控件。

绝对布局与Canvas

  绝对布局则是以控件的左上角作为坐标原点,以Canvas控件的两个属性Left和Top来确定控件坐标位置,在新建一个普通页面之后可以把Content的Grid给删掉,更替成Canvas,再添加一个TextBlock和一个TextBox

         <Canvas Name="ContentPanel" Grid.Row="1">
<TextBlock Text="TextBlock" Canvas.Left="23" Canvas.Top="25"/>
<TextBox Width="320" Canvas.Left="110"/>
</Canvas>

动态布局

  感觉是除了绝对布局以外的所有布局都属于动态布局,对于Android而言,Android中的线性布局,网格布局都属于这里的动态布局,WinPhone的StackPanel则是线性布局,Grid则是网格布局。

Grid控件

  Grid控件说是最灵活的布局面板,听了觉得有点黯然,Android的相对布局没有了,但WinPhone的Grid控件却比Android的TableLayout强大。在Grid中利用Grid.RowDefinitions和Grid.ColumnDefinitions定义面板中的行数和列数,例如

         <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
</Grid>

这里行的高度和列的宽度都有用到Auto和*,这两个值有不同的含义,Auto是指会根据内容的大小来调节这一行的行高多少或者这一列的列宽是多少;*号是指在计算完Auto之后控件的宽或高剩余的再去平均分,有多少个*就分多少份,上面的例子行只有一个*,假如多加2个<RowDefinition Height="*"/>,那么凡是带*号的行的行高则是除了Auto之后,再均分成3份,每份是1/3。*号前还可以带一个数字,表明这是原来的n倍,例如

             <Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="2*"/>
</Grid.RowDefinitions>

这里有两个*号还有一个2*,那么在均分时就是分4份,前两个*分到的是一份,最后的2*分到的是两份。

StackPanel控件

  这个控件则比较简单,与Android中的LinearLayout类似,他可以分水平排列和垂直排列两种,通过Orientation属性,枚举值也是只叫Vertial和Horizontal。例如

         <StackPanel Name="ContentPanel" Grid.Row="1" Orientation="Vertical">
<Button Content="Button1" Width="Auto" Height="Auto"/>
<Button Content="Button2" />
<Button Content="Button3" />
</StackPanel>

假如把Orientation="Horizontal",效果则如下所示

在WinPhone的布局中还有几个比较有用 的属性

  • Margin这个属性,它是控件与父容器相隔的距离,例如Margin="10,1,0,3"它分别表示Margin.Left=10,Margin.Top=1,Margin.Right=0,Margin.Botton=3的距离,其顺序就是左上右下一个圈;
  • VerticalAlignment和HorizontalAlignment属性,它表示控件对于父控件的对齐方式。

页面的分类

利用VS来建立一个新的页面时都有三种选择,

像图中1里面的那种是空白页类型的,这种页面是最基础,在系统里面也能看见,一般在整个页面导航数中的叶子端,

这种页面在Xaml的定义中,把最根处的Grid分了两部分,一部分是一个StackPanel,它用来放置显示程序名称和页面名称的TextBlock。另一部分才是页面内容。

     <Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions> <!--TitlePanel 包含应用程序的名称和页标题-->
<StackPanel Grid.Row="0" Margin="12,17,0,28">
<TextBlock Text="我的应用程序" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock Text="页面名称" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel> <!--ContentPanel - 在此处放置其他内容-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> </Grid>
</Grid>

Panorama页

第二个是Panorama页,这个中文叫全景页,在WinPhone8的照片应用,游戏都用了这类的页面,

它实际上是一个Panorama控件,在Xaml的定义中,它在根部的Grid中添加

<phone:Panorama Title="页面名称">

标签,Ttile属性则是本页面的名称,那么全景页中的每一项的定义如下面的形式

<phone:PanoramaItem Header="item1">

Hearder属性是定义项的名字,每个项的内容就在该标签下的Grid中定义,如

         <phone:Panorama name Title="页面名称">
<phone:PanoramaItem Header="Panorama Item1">
<Grid>
<TextBlock Text="Text Content 1"/>
</Grid>
</phone:PanoramaItem>
<phone:PanoramaItem Header="Panorama Item2"> </phone:PanoramaItem>
</phone:Panorama>

如果需要在全景页面中添加背景图片,则需要在phone:Panorama节点下面添加以下代码

             <phone:Panorama.Background>
<ImageBrush ImageSource="~/Image/ApplicationBar.Cancel.png"/>
</phone:Panorama.Background>

或者使用代码的形式

 BitmapImage bitmapImage = new BitmapImage(new Uri(“~/Image/ApplicationBar.Cancel.png”,UriKind.Relative));
ImageBrush imageBrush = new ImageBrush();
imageBrush.ImageSource = bitmapImage;
PanoControl.Background = imageBrush;

要引入的这幅图像分辨率应当在在 480 x 800 像素和 1024 x 800 像素(宽 x 高)之间

Pivot页

第三种是Pivot页,中文叫枢轴页,在WinPhone8中,设置,日历都是用了这种类型的页面

在Android和iOS的应用中有不少是用了选项卡布局,而在WinPhone中这类型的页面最适合顶替选项卡页面了,虽然上面的全景页也有类似的效果,但鄙人觉得还是枢轴页更适合。

它实际上用的是一个Pivot控件在Xaml的定义中,它在根部的Grid中添加

<phone:Pivot Title="页面名称">

同样Title是页面的名称了,枢轴的每一项都以下面的形式添加

             <phone:PivotItem Header="Pivot1">
<Grid>
<TextBlock Text="Text Content 1"/>
</Grid>
</phone:PivotItem>

Header是每一项的标题,Grid里面自然是放置项的内容了。

使用枢轴页有几点要注意的

  • 应用应该将 Pivot 页面数(4 页或更少)降到最低;
  • Pivot 标头的高度是固定的,不能更改;
  • 建议Pivot 标头文本限制为最多一个或两个单词。

还有两点是使用枢轴页和全景页都要注意的

  • 绝对不要将 Pivot 控件放在其他 Pivot 控件内。绝对不要将 Pivot 控件放在某个 Panorama 控件内,不要在 Pivot 控件内部使用 Panorama 控件;
  • 不要使用可在全景页和枢轴页内部平移或滚动的控件。

WinPhone学习笔记(二)——页面外观剖析的更多相关文章

  1. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  2. amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules

    amazeui学习笔记二(进阶开发3)--HTML/CSS规范Rules 一.总结 1.am:以 am 为命名空间 2.模块状态: {命名空间}-{模块名}-{状态描述} 3.子模块: {命名空间}- ...

  3. 微信小程序学习笔记二 数据绑定 + 事件绑定

    微信小程序学习笔记二 1. 小程序特点概述 没有DOM 组件化开发: 具备特定功能效果的代码集合 体积小, 单个压缩包体积不能大于2M, 否则无法上线 小程序的四个重要的文件 *js *.wxml - ...

  4. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  5. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  6. JMX学习笔记(二)-Notification

    Notification通知,也可理解为消息,有通知,必然有发送通知的广播,JMX这里采用了一种订阅的方式,类似于观察者模式,注册一个观察者到广播里,当有通知时,广播通过调用观察者,逐一通知. 这里写 ...

  7. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  10. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

随机推荐

  1. 成都亚马逊AWSome Day回顾

    6月25日我和公司同仁一起参加了亚马逊在成都的第一场AWSome Day活动.整个活动时间异常紧促,短短一天包含了7堂session,讲师的狂轰乱炸使得我们同学们普遍觉得比上班累多了.好了,废话不多说 ...

  2. show一下自己的文档编写功底

    以我为例,我绝对相信,“才华”和颜值成反比.这里我要秀一下我的文档编写能力.在我这十年的工作生涯里,的确有数不清的次数,我的同事或上司,对我设计和制作的文档表示称赞. 我曾记得,2010年我在好丽友— ...

  3. CSS的样式表基本概念

    一.样式表分类 1.内联样式表 <p style="fint-size:24px;">直接在标签内部进行样式设置</style> 2.内嵌样式表 <h ...

  4. [转载] fail-fast总结(通过ArrayList来说明fail-fast的原理、解决办法)

    说明: 转载自http://www.cnblogs.com/skywang12345/p/3308762.html概要 前面,我们已经学习了ArrayList.接下来,我们以ArrayList为例,对 ...

  5. Atitit Immutability 和final的优点

    Atitit Immutability 和final的优点 什么是 immutability? 其实细分起来有语法上的 immutable (例如 Java 里的 final 关键字), 和运行时对象 ...

  6. Atitit apache 和guava的反射工具

    Atitit apache 和guava的反射工具 apache1 Spring的反射工具类 ReflectionUtils1 Guava 反射工具2 apache  34             7 ...

  7. 前端工程师技能之photoshop巧用系列第五篇——雪碧图

    × 目录 [1]定义 [2]应用场景 [3]合并[4]实现[5]维护 前面的话 前面已经介绍过,描述性图片最终要合并为雪碧图.本文是photoshop巧用系列第五篇——雪碧图 定义 css雪碧图(sp ...

  8. CSS 魔法系列:纯 CSS 绘制图形(心形、六边形等)

    <CSS 魔法系列>继续给大家带来 CSS 在网页中以及图形绘制中的使用.这篇文章给大家带来的是纯 CSS 绘制五角星.六角形.五边形.六边形.心形等等. 我们的网页因为 CSS 而呈现千 ...

  9. Asp.Net工作原理

    1. ASP.NET页面的的一般处理过程: 客户请求WEB页面 WEB服务寻找指令文件(.ASPX) ASP.NET代码被发送给CLR进行编译 HTML流返回给浏览器和指令 浏览器处理HTML并显示页 ...

  10. Android 2.x中使用actionbar - Actionbarsherlock

    1. 范例说明 从Android 3.0开始,Android引入了ActoinBar,不得不说3.0之前android的标题栏确实比较丑,并且还没有任何功能. 之前很多应用的顶部栏很多都是仿苹果的,比 ...