×
Namespaces

Variants
Actions

Windows Phone开发实践--行军篇之应用内导航

From Nokia Developer Wiki
Jump to: navigation, search
SignpostIcon XAML 40.png
WP Metro Icon WP8.png
Article Metadata

兼容于
文章
highcedar 在 31 Jan 2013 创建
最后由 hamishwillee 在 18 Jul 2013 编辑


孙子兵法行军篇第九:兵非贵益多也,惟无武进,足以并力、料敌、取人而已。夫惟无虑而易敌者,必擒于人。译文:兵力不在于多,而在于不盲目冒进,能集中力量和判明敌情。毫无深思熟虑而又轻敌的将领必定会被敌人俘虏。判明用户需求,深思用户体验,理解页面模型是软件开发者研究的课题,即Windows Phone应用程序的"行军"。尽管软件开发不是战争,但是与战争的相同的是二者的目标——"征服"。在设计之初,遐想用户的内心需求,以应用内导航机制和页面模型引导用户的好奇心去探索。 Windows Phone应用程序的"行军"是由存在于导航堆栈上的页面构成,如若应用程序中过度使用页面,则会导致导航堆栈过于繁琐,从而造成性能和可靠性降低。开发人员必须遵守在应用程序中有效使用页面导航模型,本章给出页面导航模型的最佳实践。 本章的另一个主要内容是Windows Phone 8的导航模块和框架与页面结构的增强功能:提高可用性和功能性的导航API,以及系统托盘和进度指示器。 页面导航模型和导航模块和框架与页面结构的增强功能是"行军"途中在高地、山谷安营扎寨时应该注意的原则。

主要内容:

应用内导航

  1. 页面模型和最佳实践
  2. 页面之间的导航
  3. 传递参数的导航
  4. 页面模型和最佳实践
  5. 导航增强功能

Contents

应用内导航

在Windows Phone应用程序中,用户可以向前导航到不同的内容屏幕。其核心元素为PhoneApplicationFrame的顶级容器控件,该控件可托管PhoneApplicationPage。 Windows Phone应用平台提供了框架和页面类,开Windows Phone应用程序时必须使用PhoneApplicationFrame和PhoneApplicationPage类,而不能使用标准的Silverlight框架。

WP8DP 01.png

图 Windows Phone框架 框架FRAME与Windows Phone外观集成,包含以下特性:

  • 公开的托管页面中的属性,例如屏幕方向
  • 显示用来呈现页面PAGE的客户端区域
  • NavigationService实现页面之间导航的
  • 专为状态栏和应用程序栏预留空间

页面模型和最佳实践

Windows Phone应用程序是由存在于导航堆栈上的页面所构成的,使用硬件"返回"按键访问堆栈中的页面。如果在应用程序中页面过多会导致导航堆栈过于繁琐,会造成应用的性能和可靠性降低。开发人员必须遵循在应用程序中高效的页面的导航模型设计,限制页面的过度使用。本节主要讨论为应用程序创建高效页面模型的最佳实践。 Windows Phone应用程序可以被看作是页面(Pages)、屏幕(Screens)的集合或两种元素的组合,那么Windows Phone应用程序的页面模型上下文中是如何定义"页面"和"屏幕"的呢?页面是用户可识别的持久状态集合,它可视为包含信息、可记忆内容或指向其他页面的链接的页面。屏幕不包含内存内容的常用UI屏幕(如,弹出窗口、对话框或初始屏幕),不属于用户可识别的持久状态集合。

WP8DP 02.png

图 假想的应用程序结构

Windows Phone中的对于导航定义也可理解为页面间的转换。如带箭头的图形所示,存在多个转换步骤,包括从"主页"到"工具详细页面",或从"搜索页面"到"工具详细页面"的转换。但是,并非每个转换步骤都可视为导航。例如,当您从初始屏幕移动到主页,或从登录屏幕到任何其他屏幕进行多个移动时。原因是这些屏幕都不是页面,从非页面中移动称为转换。

通过对于Windows Phone中定义的页面、屏幕和导航概念的理解,总结了使用页面模型的最佳做法:

  • 屏幕和非导航的转换——对于登录屏幕等用户界面,可以使用Popup控件覆盖部分屏幕。您可以在代码中添加BackKeyPress事件,并在弹出窗口时将e.Cancel设置为true,以使用户能够使用"返回"按键关闭对话框。
  • 多个内容视图——对于可重用的页面,只需将页面上的控件重新绑定到新DataContext即可以在不同的内容间转换,而无需使用导航至新页面。
  • 保存状态和逻辑删除——您可以保存给定页面中发生转换的本地历史记录,从而在逻辑删除应用程序时,用户可以重新跟踪其步骤。对于诸如上一个或下一个浏览之类简单情形,只需将页面"状态"保存在当前索引中。通过执行此操作以及使用NavigationContext API应提供在从逻辑删除状态返回时遍历数据集所需的所有信息。对于具有较为复杂的本地转换历史记录的应用程序(如任意形式浏览链接项),可以选择将某些历史记录存储在页面状态中,但是您需要对存储的项设置一个合理的限制。对于用户而言,关键是使用硬件"返回"按键,将其返回到以前页面。它们不应该返回到以前查看的项。
  • 导航后退堆栈 - 后退堆栈中的页面保存在内存中。应用程序应该最大限度地降低后退堆栈中页面上使用的内存,例如释放大图片、缓存数据等。

页面之间的导航

本节中举例实现MainPage.xamlSecondPage.xaml之间的导航。

  1. MainPage.xaml中,将"工具箱"中的 HyperlinkButton 控件拖动到设计器界面。选择该控件并将"内容"属性更改为"Navigate to Second Page",也可直接在MainPage.xaml中修改代码。
  2. 双击超链接控件可添加点击事件的处理程序,此时Visual Studio自动打开MainPage.xaml.cs文件。
  3. 修改hyperlinkButton1_Click事件处理程序为如下的代码,使其实现页面的跳转。
   private void hyperlinkButton1_Click(object sender, RoutedEventArgs e)
   {
       NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));
   }
  1. SecondPage.xaml中,将Button控件拖动到设计器界面。选择该控件并将其"内容"属性更改为"Navigate Back to Main Page",也可直接在SecondPage.xaml中进行更改。
  2. 双击Button控件可添加点击事件的处理程序,此时Visual Studio自动打开SecondPage.xaml.cs文件。
  3. 修改button1_Click事件处理程序为如下的代码,使其实现后退的导航。
   private void button1_Click(object sender, RoutedEventArgs e)
   {
       NavigationService.GoBack();
   }

NavigationService.GoBack()方法虽然可实现后退的导航,但是建议在软件设计时使用硬件"返回"按键实现后退。

WP8DP 03.png

图 页面间导航


传递参数的导航

本节中举例实现MainPage.xamlSecondPage.xaml之间传递参数的导航。MainPage.xaml在导航时将参数传递给SecondPage.xaml,在SecondPage.xaml的OnNavigatedTo()方法中解析参数。

  1. MainPage.xaml中添加Button控件和TextBox控件。TextBox控件名称命名为textBox1;Button控件名称命名为param,文本设置为"Go"
  2. 双击Button控件会自动添加控件点击事件的事件处理程序,此时Visual Studio自动打开MainPage.xaml.cs文件。
  3. param_Click事件处理程序中
   private void param_Click(object sender, RoutedEventArgs e)
   {     
       NavigationService.Navigate(new Uri("/SecondPage.xaml?msg=" + textBox1.Text, UriKind.Relative));
   }
  1. SecondPage.xaml中的TextBlock命名为"textBlock1"
  2. SecondPage.xaml.cs中重载OnNavigatedTo()方法,实现导航至SecondPage.xaml时解析传递的参数,并将参数赋值给textBlock1。
   protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
   {
           base.OnNavigatedTo(e);
           string msg = "";         
           if (NavigationContext.QueryString.TryGetValue("msg", out msg))
               textBlock1.Text = msg;
   }

WP8DP 04.png

图 传递参数

页面模型和最佳实践

Windows Phone应用程序是由存在于导航堆栈上的页面构成的,如果在应用程序中过度加载页面,则会导致导航堆栈过于繁琐,造成性能和可靠性降低。开发人员必须遵守导航模型的使用准则,禁止页面的过度使用。本节主要内容为创建页面模型的最佳实践和指导。 Windows Phone应用程序是页面(pages)、屏幕(screens)的集合或二者的组合。


图 包含页面和屏幕的假想应用程序结构

Windows Phone中的导航可定义为页面间的转换。如带箭头的图形所示,存在多个转换步骤,包括从"主页"到"构件页面",或从"搜索页面"到"工具详细信息页面"的转换。但是,并非每个转换步骤都可视为真正的导航:例如,当您从初始屏幕移动到主页,或从登录屏幕到任何其他屏幕进行移动时。从非页面中移动可称为转换。 页面模型的最佳实践

  • 屏幕和非导航的转换——对于登录屏幕等用户界面,可以使用Popup控件显示。在代码中添加BackKeyPress事件,在弹出窗口时将e.Cancel设置为true,以使用户能够使用"返回"按键关闭该对话框。
  • 多内容视图——将页面绑定到不同的DataContext即可实现多内容视图,将不同的内容共享一个页面,在同一个页面中切换不同的内容而无需导航至新页面。比如新闻聚合类的应用,可以考虑使用上一个和下一个的"应用程序栏"按钮实现多内容视图的切换。
  • 保存状态和逻辑删除——应用进入休眠状态前保存必要的历史记录,从而在应用从逻辑删除状态重新激活时遍历保存的数据集信息,让用户可以返回之前的页面状态。但是您需要对存储的项设置一个合理的限制。对于用户而言,重要的是使用硬件"返回"按键,将其返回到以前页面即可,不必返回到以前查看的项。
  • 导航后退堆栈——后退堆栈中的页面保存在内存中。应用程序应该最大限度地降低后退堆栈中页面上使用的内存,例如释放大图片、缓存数据等。

下表是通用的页面模型说明。

WP8DP 06.png

导航增强功能

Windows Phone 8为导航模块和框架与页面结构提供了诸多增强功能,包括改进了导航API的功能性,以及PhoneApplicationFrame和PhoneApplicationPage类和系统托盘的增强功能。

导航API的增强功能

1. 确定可取消的导航事件 NavigatingCancelEventArgs类具有Cancel属性,可将其设置为取消已请求的导航。为了确定导航是否真正可取消,NavigatingCancelEventArgs类添加了一个新的Boolean属性 IsCancelable。True表示可以取消导航;否则,无法取消导航。下面的代码说明了如何检查导航是否可以取消,并询问用户是否真的希望删除导航。

       protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
       {
           base.OnNavigatingFrom(e);
           // If the navigation can be canceled, ask the user if they want to cancel
           if (e.IsCancelable)
           {
               MessageBoxResult result = MessageBox.Show("Do you want to stay here?", "Confirm Navigation from Page", MessageBoxButton.OKCancel);
               if (result == MessageBoxResult.OK)
               {
                   // User wants to stay here
                   e.Cancel = true;
                   return;
               }
           }
       }

2. 网页过渡启用导航方向检测

在Windows Phone中,网页过渡动画取决于导航的方向。导航的方向可能向前,也可能是向后。为了指示所发生导航的类型,NavigationMode类提供了只读的NavigationMode属性,指示所发生的导航类型的值Back、Forward或New。默认值为"New"。

3. 启用外部导航检测

应用程序可以检测到外部应用程序的导航,因为在导航事件中传递的URI是app://external/。在以前的Windows Phone版本中,无法通过直接的方法来检测传入导航是否来自应用外部。 在Boolean类型的属性IsNavigationInitiator已添加至NavigatingCancelEventArgs类。对于导航来自外部应用程序或"开始"屏幕的情况,此属性设置为False。当导航是在应用程序的内部时,则设置为True。此属性的默认值为True。

使用后退堆栈

后退堆栈是应用程序的导航历史记录,后退堆栈中的每个条目代表页面的URI。页面的后退堆栈中可以有多个条目,但是每个条目都会引用页面的不同实例。

框架和页面增强功能

更新PhoneApplicationFrame和PhoneApplicationPage类,改进了系统托盘,在系统托盘添加了进度指示器。

1. PhoneApplicationFrame

PhoneApplicationFrame类新增了与NavigationService类相同的新成员,包括RemoveBackEntry方法、JournalEntryRemoved事件和BackStack属性。另外还有PhoneApplicationFrame类中的BackKeyPress事件,在活动页面接收事件并取消事件前,框架可以直接激发该事件。

2. PhoneApplicationPage

通过RemoveBackEntry方法从日记中移除某个页面之后,在该页面上调用OnRemovedFromJournal方法。OnNavigatedFrom(NavigationEventArgs)在正常后退导航中重写之后也调用此方法。其目的是帮助开发人员在单个事件中实现清理功能,并通知页面它将从日志中删除,以便它可以释放资源,确保有资格进行垃圾回收。请注意您不可使用此方法来保存数据、执行动画或加载并保存页面状态。 新的JournalEntry类,其Source属性现在可访问并且是只读的。

3. 系统托盘增强功能

系统托盘现在支持类似于应用程序栏的不透明度和颜色。下列Public的可读写的属性已增加到PhoneApplicationPage实例:

  • BackgroundColor
  • ForegroundColor
  • Opacity
  • ProgressIndicator

4. 进度指示器

进度指示器(ProgressIndicator)用于指示操作的进度。系统托盘和进度指示器是父子关系。无论进度指示器是否可见,在隐藏系统托盘时,指示器都会隐藏起来。进度指示器(ProgressIndicator)具有以下公共属性:

  • IsVisible——可以确定指示器是否处于活动状态
  • Text——要在执行任务时显示的短文本字符串
  • Value——从 0 到 1 的进度值
  • IsIndeterminate——将进度指示器呈现为仪表或三个飞行点
This page was last modified on 18 July 2013, at 09:37.
118 page views in the last 30 days.
×