Windows Phone 8 的框架、页面和导航功能

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

本主题介绍 Windows Phone 导航模型的一些功能以及框架和页面体系结构。这些功能自最初发布 Windows Phone 之后得到添加或增强。

本主题包括以下部分。

以下是导航 API 的一些功能。

确定是否可以取消导航

NavigatingCancelEventArgs 类具有一个 Cancel 属性,可将其设置为取消已请求的导航。但是对于某些情况(如由系统而不是用户启动导航),则导航不可取消,而且设置 Cancel 属性无效。如果您的应用不能正确处理此类情况,则用户会丢失更改,因为无法取消导航并停留在当前页面。如果无法取消导航,可以采用另一种方法来保存用户的更改。

为了确定导航是否真正可取消,NavigatingCancelEventArgs 类中提供了一个新的布尔属性 IsCancelabletrue 表示可以取消导航;否则,无法取消导航。下面的代码说明了如何检查导航是否可以取消,并询问用户他们是否希望删除导航:


        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;
                }
            }

        }

检测网页过渡的导航方向

网页过渡动画取决于导航的方向,向前或向后。为了指示所发生导航的类型,NavigationMode 类上提供了一个只读 NavigationMode 属性,以及一个构造函数重载以提供属性值。如果未使用构造函数,则 NavigationMode 的默认值是 New,表示用户正在导航至新内容。

检测至外部应用的导航

应用可以检测至外部应用的导航,因为在导航事件中传递的 URI 是 app://external/。但是,在 Windows Phone 的原始版本中,无法通过任何直接的方法来检测传入导航是否来自外部源。对于自定义特定于不同类型导航的动画,此信息非常有用。

为了启用此功能,NavigationModeNavigatingCancelEventArgs 类中提供了布尔属性 IsNavigationInitiator。对于导航来自外部应用或“开始”屏幕或者导航至外部应用或“开始”屏幕的所有情况,此属性设置为 false。当导航是在应用程序的内部时,则设置为 true。还提供了一个新构造函数重载以设置此属性的值。如果未设置,则默认值为 true,表示属于应用内部的导航。

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

  • 若要将当前页替换为新页,请向前导航至新页,然后移除后退堆栈的顶部。

  • 若要移除指定页(一般是第一页)之前的所有页,请移除所有介入页并导航回到第一页。

  • 若要清除整个后退堆栈并将其替换为指定的页,请向前导航至新页,然后移除后退堆栈中的所有条目。

有关使用后退堆栈的更多信息,请参见如何使用 Windows Phone 8 的后退堆栈进行导航

BackStack 属性

BackStack 属性返回后退堆栈中的条目列表。

RemoveBackEntry 方法

RemoveBackEntry 方法可从后退堆栈中移除最近的条目,如果没有其他要移除的条目,则引发 InvalidOperationException。如果您想移除多个项目,则必须多次调用此方法。此 API 是同步的,因此必须从 UI 线程调用。

JournalEntryRemoved 事件

NavigationService 类中提供了 JournalEntryRemoved 事件。在 RemoveBackEntry 操作期间或引发 Navigated 事件后正常的后退导航期间引发此事件。

JournalEntryRemovedEventArgs类具有一个只读属性 Entry,即正要移除的项目的日记条目。

以下是 PhoneApplicationFramePhoneApplicationPage 类的一些功能。

PhoneApplicationFrame

PhoneApplicationFrame 类具有与 NavigationService 类相同的成员。这包括 RemoveBackEntry() 方法、JournalEntryRemoved 事件和 BackStack 属性。它们的运行方式都与 NavigationService 中的成员相同。

同样,PhoneApplicationFrame 类中也提供了 BackKeyPress 事件。在活动页面接收事件并取消按键之前,框架可以直接处理该事件。

PhoneApplicationPage

通过 RemoveBackEntry() 方法从日记中移除某个页面之后,在该页面上调用 OnRemovedFromJournal(JournalEntryRemovedEventArgs) 方法。OnNavigatedFrom(NavigationEventArgs) 在正常后退导航中重写之后也调用此方法。此事件的目的是通知页面它将从日志中删除,以便能够释放资源,并确保有资格进行垃圾回收。此事件允许您将所有清除代码放置在一个事件中。但是请勿使用此事件来保存数据、播放动画或加载和保存页面状态;这些操作包含在导航事件中。

提供了一个 JournalEntry 类。其 Source 属性也可访问,并且是只读的。

系统托盘支持类似于应用程序栏的不透明度和颜色。系统托盘的下列公共读/写附加属性可以附加到 PhoneApplicationPage 实例:

ProgressIndicator

系统托盘中的 ProgressIndicator 用于指示操作的进度。

若要使用 ProgressIndicator 且不影响页面的布局,请将 SystemTrayOpacity 属性值设置为 0(零)。

ProgressIndicator 具有以下公共属性:

  • IsVisible – 可以确定指示器是否处于活动状态

  • Text – 要在执行任务时显示的短文本字符串

  • Value – 从 0 到 1 的进度值

  • IsIndeterminate – 如果为 true,则会将进度指示器呈现为数个滚动点

无论进度指示器本身是否可见,在隐藏系统托盘时,指示器都会隐藏起来。

显示:
© 2014 Microsoft