Frame和Page类
在为应用程序添加更多的函数之前,需要了解添加过的页面如何为应用程序提供导航支持。Frame类主要用来相应导航,或者执行一些类似Navigate, GoBack, 和 GoForward的方法。使用Navigate方法使内容显示在框架中。在先前的例子中App.OnLaunched方法创建一个Frame并将BasicPage1传递给Navigate方法。然后这个方法设定应用程序当前窗口的内容为Frame。应用程序窗口包含Frame,而Frame又包含BasicPage1。
BasicPage1 是Page类的非直接子类,Page类有一个Frame属性,一个可以获得包含Page的read-only(只读)属性。当HyperlinkButton的Click事件处理器调用Frame.Navigate(typeof(BasicPage2))时,应用程序窗口的Frame会显示BasicPage2的内容。
11.1.3 页面模板对导航的支持
当创建导航页面时,使用Basic page 模板,这种或者其他支持导航的模板创建了页面,这页面的右上角提供一个Back按钮,这个按钮只有可用时才可见。这个按钮的IsEnabled属性绑定到Frame.CanGoBack属性上,这就是为什么在第一个页面上看不到Back按钮,而在第二个页面才可以看到。
Basic Page模板创建的类可以继承LayoutAwarePage类,这个LayoutAwarePage类添加到项目中的Common/LayoutAwarePage.cs文件中,LayoutAwarePage类定义了GoBack 和GoHome方法。Back按钮援引LayoutAwarePage.GoBack方法,而Home按钮调用LayoutAwarePage.GoHome方法。
下面的Page模板提供相同的导航支持:
q Basic page
q Group Detail page
q Grouped Items page
q Item Detail page
q Items page
q Split page
11.1.4 页面间传递信息
前面的应用程序只是在两个页面进行导航,但是通常应用程序会有多个页面,而且页面与页面也需要共享信息,可以将第一个页面的某些信息传递到第二个页面中。
在BasicPage1.xaml页面中用下面的代码替换之前添加的StackPanel。
<StackPanel Grid.Row="1"
Margin="120,0,120,60">
<TextBlock Text="Enter your name"/>
<TextBox Width="200" HorizontalAlignment="Left" Name="tb1"/>
<HyperlinkButton Content="Click to go to page 2" Click="HyperlinkButton_Click_1"/>
</StackPanel>
在BasicPage1.xaml.cs中用下面的代码替换HyperlinkButton_Click_1事件处理器。
private void HyperlinkButton_Click_1(object sender, RoutedEventArgs e)
{
this.Frame.Navigate(typeof(BasicPage2), tb1.Text);
}
在BasicPage2.xaml.cs中用下面的代码替换空的OnNavigatedTo方法。
protected override void OnNavigatedTo(NavigationEventArgs e)
{
string name = e.Parameter as string;
if (!string.IsNullOrWhiteSpace(name))
{
tb1.Text = "Hello, " + name;
}
else
{
tb1.Text = "Name is required. Go back and enter a name.";
}
}
运行应用程序,在Text Box属于名称,然后单击链接Click to go to page 2。当BasicPage2页面加载时调用rame.Navigate (typeof(BasicPage2), tb1.Text),在HypelikButten的Click事件中的tb1.Text属性被传递。然后BlankPage2的OnNavigated方法获得NavigationEventArgs.Parameter属性值,进而用来显示一条信息。