欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Windows phone 7之页面导航

程序员文章站 2022-06-21 15:46:02
首先说一下wp7程序的呈现主体与关系,直接呈现给用户的界面是页面page,每个page是继承自phoneapplicationpage的类,一个程序可以包含任意多个的page页面,这些page页面被...

首先说一下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

  Windows phone 7之页面导航


 Windows phone 7之页面导航


 

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跳转在路径后面加参数效果是一样的

  Windows phone 7之页面导航


作者  董贺超