• Windows Phone 7 开发探索笔记5——页面间导航


    2010-12-7 9:36:43 发布:机微网 来源:WP7爱好者 浏览:-1次 字体:|| 打印此文 关闭窗口

    本文将介绍如何在Silverlight for Windows Phone中进行页面间导航(跳转)操作。

    一.NavigationService

    页面间的导航操作需要通过类来实现。首先来看演示程序的XAML代码和截图(我在项目中添加了一个页面):

    页面1的XAML:
    <Gridx:Name="ContentPanel"Grid.Row="1"Margin="12,0,12,0">
    <StackPanelVerticalAlignment="Center">
    <TextBoxx:Name="txtInput"></TextBox>
    <HyperlinkButtonx:Name="hyperLinkButton"NavigateUri="/SubPage.xaml"Content="点此进入第2页"/>
    <Buttonx:Name="btnMain"Content="前往第2页"Click="btnMain_Click">
    </Button>
    </StackPanel>
    </Grid>

    页面2的XAML:
    <Gridx:Name="ContentPanel"Grid.Row="1"Margin="12,0,12,0">
    <StackPanelVerticalAlignment="Center">
    <Buttonx:Name="btnBack"Content="前往第1页"Click="btnBack_Click">
    </Button>
    </StackPanel>
    </Grid>

    截图:

    我在第1个页面中添加了一个HyperlinkButton。HyperlinkButton生来就是用作导航的,它有一个NavigateUri属性,将这个属性设置为SubPage.xaml,点击它时会自动导航到那个页面。Button并没有这个属性,所以我需要在Code-Behind文件中添加如下代码:
    this.NavigationService.Navigate(newUri("/SubPage.xaml",UriKind.Relative));
    属性是定义在Page类中的,类型为NavigationService。此类型包含以下主要属性,方法和事件:

    属性:
     

    CanGoBack 获取一个值,指示后退导航历史记录中是否至少有一个条目。

    CanGoForward


     

    获取一个值,指示前进导航历史记录中是否至少有一个条目。


     
    CurrentSource 获取当前显示的内容的统一资源标识符 (URI)。
    Source

    获取或设置当前内容或要导航到的内容的统一资源标识符 (URI)。


     


    方法:
     

    GoBack 导航到后退导航历史记录中的最新条目,如果后退导航时没有条目,则引发异常。
    GoForward 导航到前进导航历史记录中的最新条目,如果前进导航时没有条目,则引发异常。
    Navigate 导航到统一资源标识符 (URI) 指定的内容。
    StopLoading

    停止尚未处理的异步导航。


     


    事件:
     

    FragmentNavigation 在开始导航到内容片段时发生。
    Navigated 当找到正导航到的内容且此内容可用时发生。
    Navigating 在请求新导航时发生。
    NavigationFailed

    如果在导航到所请求的内容时出现错误,则会发生此事件。


     
    NavigationStopped

    在调用 StopLoading方法时发生,或者在当前导航正在进行过程中又请求一个新导航时发生。


     


    最常用的方法是Navigate( )方法,它需要一个Uri类的参数,所以我们需要将相应的路径封装到一个Uri类中。在页面2中那个Button的Click事件处理程序里我添加了如下的代码:
    if(this.NavigationService.CanGoBack)
    NavigationService.GoBack();

    首先,检测后退导航历史中是否有条目,如果在没有条目的情况下调用GoBack方法会引发异常,


    当然,在第2页的Click事件中也可以不使用GoBack,而用Navigate( )方法,如下:
    this.NavigationService.Navigate(newUri("/MainPage.xaml",UriKind.Relative));
    但这和GoBack方法有本质区别。为什么这么说呢:因为无论是使用HyperlinkButton的NavigateUri属性还是NavigationService类的Navigate方法,系统都会为要导航到的页面创建一个全新的实例并显示它,这些都是在幕后完成的,对我们来说是透明的。但GoBack方法是从后退导航历史中查找最近的一个页面并加载它,并没有创建实例的动作。

    下面来验证一下:运行程序,在页面1中的文本框中输入一些文本

    然后点击按钮导航到页面2

    点击页面2中的按钮,呈现出来的页面1里面的文本框是空的。


    这时如果点击2次“返回”按钮,会按下面的顺序显示

    出现这种情况的原因就是因为页面2中使用了NavigationService类的Navigate方法,所以在点击按钮时创建了页面1的一个全新的实例,新实例的文本框肯定是没有内容的。也就是说现在后退历史中有3个页面:初始的页面1,目标导航页面2,新生成的页面1。所以会产生上面的情景。

    Silverlight for Windows Phone中的导航系统基于一个类似栈的结构,姑且把它叫做“后退栈”。当一个发起导航请求的页面调用Navigate方法时,这个页面首先会被压入后退栈,然后会创建那个目标页面并显示。当一个页面调用GoBack()方法或者在我们按下“返回”按钮时,当前的这个页面就会被抛弃,后退栈顶部的页面就会被弹出并显示。

    二.不一样的GoForward方法

    Silverlight for Windows Phone使用了与标准Silverlight相同的NavigationService类和页面模型,但Windows Phone的文档中并没有说清楚,看似Silverlight for Windows Phone中支持后退和前进导航,其实它并不支持前进导航。NavigationService类的CanGoForward属性总是为False.在Windows Phone中GoForward方法总会抛出异常,因为Windows Phone只有“后退栈”,没有“前进栈”。如果想在程序中实现向前导航的话,只能手动添加相应的按钮或菜单了。

    好了,关于页面导航就说这么多,下篇文章会介绍如何在页面间传递数据。

    三.下载示例代码:

    WindowsPhoneNavigationDemo.zip

    如果大家喜欢我的文章,请点击“推荐”,谢谢!

    转载地址:http://www.gwewe.com/dev/topics/1012079711.html

  • 相关阅读:
    Part0:安装Django
    计算机技术与科学系列笔记
    svg基础知识体系建立
    js如何判断字符串里面是否含有某个字符串
    js字符串如何倒序
    js判断值是否是数字
    HTML DOM 知识点整理(一)—— Document对象
    Git hub pull时候的错误 : The current branch is not configured for pull No value for key branch.master.merge found in configuration
    Map的3种遍历[轉]
    如何刪除GitHub中的repository
  • 原文地址:https://www.cnblogs.com/xingchen/p/1971768.html
Copyright © 2020-2023  润新知