Namespaces

Variants
Actions

Please note that as of October 24, 2014, the Nokia Developer Wiki will no longer be accepting user contributions, including new entries, edits and comments, as we begin transitioning to our new home, in the Windows Phone Development Wiki. We plan to move over the majority of the existing entries over the next few weeks. Thanks for all your past and future contributions.

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

From 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 06:37.
305 page views in the last 30 days.

Was this page helpful?

Your feedback about this content is important. Let us know what you think.

 

Thank you!

We appreciate your feedback.

×