〉Page导航的重要元素– Navigation Framework:
Windows Phone Applications是由Silverlight Pages所组合而成,为了让Pages之间可以互相浏览与串联,因此,存在了一个
「Navigation Stack」。该Stack透过First in first out的概念储存了所有浏览过程的Page,协助按下Back键时回到目标的页面。
但在此,MSDN上也提到「过度使用Page,将可能造成Application储存了多余残留的Page资讯在navigation stack中,影响应
用程度的性能与可靠性」。
至于二页资料要传过去的方法,可以参考该篇的介绍方法:< How to: Perform Page Navigation on Windows Phone >,
它透过NavigateService.Navigate()来传递参数在URL中,并且配合新的一页的OnNavigatedTo()来处理取得的资料。
上面运作的顺序,将会影响在处理Page交换时,资料的换手与储存。
// Do not add any additional code to this method
private void CompleteInitializePhoneApplication( object sender, NavigationEventArgs e)
{
// Set the root visual to allow the application to render
if (RootVisual != RootFrame)
RootVisual = RootFrame;
// Remove this handler since it is no longer needed
RootFrame.Navigated -= CompleteInitializePhoneApplication;
}
不知道你是否跟我一样好奇,什么是RootVisual。
其实在整个运作Application一开始,还没有真正载入Page或Frame的时候(也就是在程式出现splash screen的时间点),该Application是
没有主画面的,因此,可以看到当App.xaml在InitializePhoneApplication()方法时,写上了下面代码:
// Do not add any additional code to this method
private void InitializePhoneApplication()
{
if (phoneApplicationInitialized)
return ;
// Create the frame but don't set it as RootVisual yet; this allows the splash
// screen to remain active until the application is ready to render.
RootFrame = new PhoneApplicationFrame();
RootFrame.Navigated += CompleteInitializePhoneApplication;
// Handle navigation failures
RootFrame.NavigationFailed += RootFrame_NavigationFailed;
// Ensure we don't initialize again
phoneApplicationInitialized = true ;
}
在代码一开始初始化了一组RootFrame(也就是PhoneApplicationFrame),并且在RootFrame完成Navigated事件处理时,即调用
CompleteInitializePhoneApplication()事件处理者,该事件处理者就把RootFrame指定给RootVisu??al,让应用程序得知主画面是谁。
然而,Frame成为了主画面,而PhoneApplicationPage只是Frame中的Content。
换句话说,RootVisual就是用来取得或设定主要应用程序的UI。所以我们才可以透过Frame来控制所有的Page。但是,
它有一个先天的条件:「您只能从代码码设定RootVisual属性值一次,但是可不限次数地取得其值。」这点要特别注意。
〉Application Page Model of Windows Phone:
Application Page Model是WP7整个运作的关键,它与该篇介绍的Navigation Framework是互相关联的,因此,如果这篇内容,
有写的不够详细的地方,可以直接往Application Page Model这个关键字下去搜寻。另外,顺带一提,在MSDN文件里有看到
Page与Screen的定义,二者的差别在于:
Page
Screen
A user-recognizable collection of persistent state.
not a user-recognizable collection of persistent state
as a Silverlight page that contains information, memorable content, or links to other pages.
such as a pop-up window, dialog box, or splash screen .
〉选取MSDN上针对Navigation使用的建议:
A. Screens and Non-Navigational Transitions
针对transient UI(短暂出现的UI),建议使用Pop-Up Control去呈现内容。学习BackKeyPress事件去隐藏PopUp(或Dialog box)的内容。
B. Multiple Content Views
对于使用多个页面显示内容,建议可以使用多个DataContext元件来通过与用户的操作进行信息的互动与呈现。当然,你可以使用
多个Page来使用会比较容易,但必须注意Back键的处理以免造成多余的stack信息被储存下来。
C. Saving State and Tombstoning
建议注意代码储存目前状态的处理,由于程序可能被转换成tombstone,因此,可以透过NavigationContext API来保留目前状态或识
别导向来往二边的状态与信息,进一步控制呈现的信息内容。