Windows phone 7之页面导航
首先说一下wp7程序的呈现主体与关系,直接呈现给用户的界面是页面page,每个page是继承自phoneapplicationpage的类,一个程序可以包含任意多个的page页面,这些page页面被放在一个共同的frame下,frame继承自phoneapplicationframe 。一个应用程序只能有一个frame,创建程序时自动生成的app.xaml.cs文件中,有关于程序frame初始化的代码,在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;
}
可以看到,注释提到,不要添加对于的代码到该方法中,所以我们也不要这么做。
当我们改变某个page的属性时不会影响其他页面,但是一旦改变了frame,那就会影响所有的页面,所以,我们应该认为frame是只读的(虽然不是)。
app类是程序主类,我没刻意用它来操作全局的属性,比如获取frame,就是rootframe属性。
页面导航的方法
页面导航一般分为两种方法,代码导航,和xaml声明导航
1、代码实现
navigationservice类提供了导航的功能,navigationservice.navigate(new uri("/newpage.xaml", urikind.relative));将这段代码放到button点击事件中,点击button就会跳转到newpage.xaml页面,其中naviagte接受一个uri类型的参数,这里传入字符串路径和路径类型urikind,urikind是个枚举型,一边页面导航是相对路径。wp7的特点的从根目录起,"/"开头表示根目录,依次输入文件路径,newpage.xaml文件放在了根目录下,所以路径写为"/newpage.xaml", 如果newpage.xaml在根目录的view文件夹下,则路径为"/view/newpage.xaml"。
2、xaml实现
可以利用导航控件如 hyperlinkbutton,写法<hyperlinkbutton navigateuri="/newpage.xaml" content="goto new page" height="30" horizontalalignment="left" margin="10,92,0,0" verticalalignment="top" width="200" />,navigateuri属性用来设置路径。
上述两种方式达到的目的是一样的,点击button或hyperlinkbutton就会跳转到newpage.xaml
wp7页面导航可以使用路径别名,也是从silverlight继承过来的
首先在app.xaml的文件上注册windows.navigation 命名空间,代码:mlns:navigate="clr-namespace:system.windows.navigation;assembly=microsoft.phone",
然后注册资源代码如下:
<application.resources>
<navigate:urimapper x:key="urimapper">
<navigate:urimapping uri="newpage" mappeduri="/newpage.xaml"/>
</navigate:urimapper>
</application.resources>
最后给frame添加urimapper :this.rootframe.urimapper = resources["urimapper"] as urimapper; 将这句代码写到app类的构造函数里即可。
使用方式
navigationservice.navigate(new uri("newpage", urikind.relative));
<hyperlinkbutton navigateuri="newpage" content="goto new page" height="30" horizontalalignment="left" margin="10,92,0,0" verticalalignment="top" width="200" />
路径中直接填别名就可以了,运行效果还是一样的。
页面之间传递参数
页面传递参数和网页中传递参数的方式一样,在路径的后面加上"?参数名=参数值"
navigationservice.navigate(new uri("/newpage.xaml?id=10", urikind.relative));
<hyperlinkbutton navigateuri="/newpage.xaml?id=10" content="goto new page" height="30" horizontalalignment="left" margin="10,92,0,0" verticalalignment="top" width="200" />
这样就导航到了newpage.xaml并将id及其值传递到了newpage.xaml中。
在newpage.xaml中接受参数的方法
navigationcontext的querystring属性存储了上个页面中传递的所有参数下面代码获取id并用messagebox显示其值
if (navigationcontext.querystring.containskey("id"))
{
messagebox.show(navigationcontext.querystring["id"]);
}
导航中使用了别名的话也可以将参数传递变得简单,修改资源为
<application.resources>
<navigate:urimapper x:key="urimapper">
<navigate:urimapping uri="newpage" mappeduri="/newpage.xaml"/>
<navigate:urimapping uri="newpage/{param}" mappeduri="/newpage.xaml?id={param}"/>
</navigate:urimapper>
</application.resources>
这样通过
navigationservice.navigate(new uri("newpage/10", urikind.relative));
<hyperlinkbutton navigateuri="newpage/10" content="goto new page" height="30" horizontalalignment="left" margin="10,92,0,0" verticalalignment="top" width="200" />
就可以将id=10传递到newpage.xaml,
由于定义了两个导航到urimapping,表现方式不一样,参数传递方世也不一样,加上默认不使用别名的方式,给newpage.xaml传递参数,路径可以有三种写法
"/newpage.xaml?id=10“,"newpage?id=10“,"newpage/id=10“,效果一样。
页面传递参数是页面之间共享数据的一种方式,还有两种比较创建的数据共享方法,一种是全局变量,比如使用静态类,和app类的静态成员,这种方法比较简单,会c#的童鞋都会使用,还有一种方式是使用isolatedstorage类,这也是集成自silverlight,叫做独立存储。独立存储在wp7程序的声明周期和数据共享起到最重要的作用,没有之一,所以,无论如何也要掌握,我将之留到介绍wp7程序的声明周期时详细讲。这里只写一下他最简单用法,不理解的童鞋别急。
在mainpage.xaml.cs中写入
private void btnnavigate_click(object sender, routedeventargs e)
{
isolatedstoragesettings iss = isolatedstoragesettings.applicationsettings;
iss["id"] = 10;
navigationservice.navigate(new uri("newpage", urikind.relative));
}
在newpage.xaml.cs中写入
isolatedstoragesettings iss = isolatedstoragesettings.applicationsettings;
if (iss.contains("id"))
{
messagebox.show(iss["id"].tostring());
}
最终运行和navigationservice跳转在路径后面加参数效果是一样的
作者 董贺超