`
foo
  • 浏览: 26747 次
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

页面导航与参数传递

阅读更多

在学习过程中,大致的总结一些页面导航与参数传递的知识。

通常我们的应用程序是由多个应用页面构成的,于是就有一个十分重要的行为——页面间的切换。在这里成为页面间的导航。我们需要注意的问题是:怎么实现切换和怎么传递参数。
我们要了解的信息是:

  • 每个页面都有一个独立的URI;
  • 每一个页面都是无状态的,也就是每次加载完页面后,需要重新加载这个页面中所必须的所有参数和数据;
  • 每个页面可以像Web一样,通过链接地址的方式导航。

显而易见,我们实现页面切换的必要数据就是每一个页面的URI,这和我们Web中的Uri的书写是相仿的,我们一样可以通过“?id=‘’”的形式来传递参数。

我们创建一个项目,叫做“NavigationPractice”,添加一个页面叫做“MyPage.xaml”,这是主页面MainPage需要导航到的页面。

四种页面切换的方式 

使用HyperlinkButton来实现

这也是HyperlinkButton的一个重要的应用方式,通过指定HyperlinkButton的NavigateUri属性,实现导航,具体实现:

            <HyperlinkButton Content="点击跳转" Height="30" 
                             HorizontalAlignment="Left" Margin="28,41,0,0" 
                             Name="myHyperlinkButton" VerticalAlignment="Top" 
                             Width="200" NavigateUri="/MyPage.xaml"/>

 

在代码中进行导航

通过页面的NavigationService来实现,NavigationService在这里是页面PhoneApplicationPage的一个属性,取主机用于导航到此页的服务,实际是返回一个NavigationService类型的值,相当于是实例化一个NavigationService的对象。同理,用于接收参数的NavigationContext也是PhoneApplicationPage的一个属性,获取包含有关导航请求的信息的对象,实际上是返回一个NavigationContext类型的属性值,相当于是创建了一 个NavigationContext 的实例。

具体实现:定义一个按钮,给按钮添加Click事件,以实现导航。

 this.NavigationService.Navigate(new Uri("/MyPage.xaml", UriKind.Relative));

 

返回操作

就是当在一个页面中操作完成后,返回到前一个页面中进行操作。

方法一:

使用代码:NavigationService.GoBack()。

方法二:

使用返回键实现返回操作。

补充:禁用返回按键的返回操作。给当前页面添加BackKeyPress事件,使用e.Cancel=true;的方式来禁用返回按键。

 

别名导肮

即定义系统资源,使用别名来实现导航。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="MyNewPage" MappedUri="/MyPage.xaml"/>
</navigate:UriMapper>
</Application.Resources>

最后,给Frame添加UriMapper :this.RootFrame.UriMapper = Resources["UriMapper"] as UriMapper;即将这句代码写到App类的构造函数中。

在使用的时候,就像之前的应用一般,只是在路径名中直接书写路径别名就行了。

NavigationService.Navigate(new Uri("NewPage", UriKind.Relative));

 

 

五种页面间参数传递的方法

直接在Uri中添加

类似于web中的参数的传递方法,在Uri中使用”?id=‘’&name=‘’“的方式添加需要传递的参数。当然这不会局限于后台代码或者是HyperlinkButton的NavigateUri属性中,如:

            this.NavigationService.Navigate(new Uri("/MyPage.xaml?flag=test",UriKind.Relative));

或:

 <HyperlinkButton Content="点击跳转" Height="30" 
                             HorizontalAlignment="Left" Margin="28,41,0,0" 
                             Name="myHyperlinkButton" VerticalAlignment="Top" 
                             Width="200" NavigateUri="/MyPage.xaml?flag=test"/>

 

使用路径别名中传递参数

在资源的定义中,我们可以定义这样的资源:

<Application.Resources>
<navigate:UriMapper x:Key="UriMapper">
<navigate:UriMapping Uri="NewPage/{param}" MappedUri="/MyPage.xaml?ID={param}"/>
</navigate:UriMapper>
</Application.Resources>

这样通过定义之后,在使用的时候new Uri("NewPage/10", UriKind.Relative));就行了,在实际使用中,如果我们在定义资源Uri的时候,使用的名称和将要转到的页面的名称一致的话,会出现以下三种效果功能相同的使用方式:

/NewPage.xaml?ID=10

NewPage?ID=10

NewPage/ID=10

对于以上两种传递参数的方式,在接受的时候,使用NavigationContext。具体方法:

 if (NavigationContext.QueryString.Keys.Contains("flag"))
            {
                NavigationContext.QueryString.TryGetValue("flag", out flag);
                myTextBlock1.Text=flag;
            }

为了很好的使用参数,避免异常等情况发生,在获取数据的时候最好先判断参数是不是存在。

 

配合独立存储传递参数

在导航的时候,配合独立存储,将需要传递的参数保存在独立存储中,由于一般传递的参数不会很大,笔者觉得使用IsolatedStorageSetting就行了。如在传递的时候:

        private void btnNavigate5_Click(object sender, RoutedEventArgs e)
        {
            IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings;
            iss["ID2"] = 10;
            NavigationService.Navigate(new Uri("NewPage", UriKind.Relative));
        }

而在接受的时候:

            IsolatedStorageSettings iss = IsolatedStorageSettings.ApplicationSettings;
            if (iss.Contains("ID2"))
            {
               this.myTextBlock1.Text=iss["ID2"].ToString();
            }

这样也算是很方便的实现了数据的传递。

 

PhoneApplicationService传递参数

这个类提供对应用程序生存期各个方面的访问。这包括对应用程序空闲行为的管理以及当应用程序变为活动或不活动时对应用程序状态的管理。在这里主要是用到了它的state属性,获取用于调用之间传递应用程序状态的词典,用来存储数据。方法:

在将要跳转的页面中重写方法OnNavigatedFrom,将需要传递的参数保存在State中:

        PhoneApplicationService myService = PhoneApplicationService.Current;

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            myService.State["name"] = "sky";
            base.OnNavigatedFrom(e);
        }

在将要跳转到的页面中重写方法OnNavigatedTo,从State中读取字典数据:

        PhoneApplicationService myService = PhoneApplicationService.Current;
        protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
            object name;
            if (myService.State.ContainsKey("name"))
            {
                if (myService.State.TryGetValue("name", out name))
                {
                    this.myTextBlock3.Text = name.ToString();
                }
            }
            base.OnNavigatedTo(e);
        }

 

共享数据传递参数

 

另一种常用的页面间共享数据的方法是使用公共资源App.xaml。在其后台代码中加入相应属性,即可使用。这种方法最经常用来传递对象,可以采用的办法是创建两个页面都可以访问到的静态对象。
具体实现:
public string Name{set;get;}
public string Number{set;get;}
在使用的时候:
(Application.Current as App).Name
(Application.Current as App).Number

如定义属性MyName,把需要传递的参数保存在共享数据中:

        private void myTextBox_TextChanged(object sender, TextChangedEventArgs e)
        {
            (Application.Current as App).MyName = this.myTextBox.Text.ToString();
        }

取得数据:

            if ((Application.Current as App).MyName != "")
            {
                this.myTextBlock2.Text = (Application.Current as App).MyName;
            }

 

以上的各种方法,在我们的项目中最这样的布局,其实就是简单地实现:

实现结果为:

项目地址:http://files.cnblogs.com/waitingsky/NavigationPractice.rar

分享到:
评论

相关推荐

    Silverlight页面跳转及页面间传递参数

    在开发基于Silverlight的应用程序时,页面跳转和页面间参数传递是常见的需求。Silverlight是一种微软开发的富客户端技术,用于构建具有丰富媒体体验和交互性功能的Web应用程序。以下将详细介绍Silverlight中的页面...

    ASP.NET页面间参数传递

    ASP.NET页面间参数传递是Web开发中的一个关键概念,它涉及到如何在不同的ASP.NET页面之间共享数据。在ASP.NET框架中,有多种方法可以实现这一目标,每种方法都有其适用场景和优缺点。让我们深入探讨一下这些方法。 ...

    html页面跳转传递参数Demo

    在网页开发中,HTML(超文本标记语言)是构建网页的基础,而页面跳转和参数传递则是实现网页间数据交互的重要技术。在这个“html页面跳转传递参数Demo”中,我们将探讨如何在HTML页面之间传递参数,以实现更丰富的...

    页面间传递参数的方法,及例子

    在网页开发中,页面间参数传递是一个常见的需求,它允许用户在浏览不同页面时保持信息的一致性或者在页面之间传递特定的数据。本教程将详细解释几种常见的页面间参数传递方法,并通过实例来帮助理解。 1. URL查询...

    微信小程序页面的生命周期和参数传递

    - 导航与路由:使用`wx.navigateTo`、`wx.redirectTo`、`wx.switchTab`等方法进行页面间的导航。 在实际的示例项目中,你可以通过查看代码来了解这些知识点的具体应用。例如,查看`onLoad`函数如何加载数据,`...

    wpf相互调用传递参数

    对于简单参数传递,最直接的方式是通过命令行参数。当在命令行中启动一个exe时,可以向其传递一个或多个参数,这些参数将在程序的Main方法中可用。 ```csharp // 在WPF应用程序的App.xaml.cs中 [STAThread] public ...

    React_native Navigator页面跳转组件参数传递

    React Native的`Navigator`组件是实现页面导航的重要工具,配合参数传递,可以轻松实现页面间的交互。通过`Actions`进行页面跳转,通过`props`接收参数,或者结合状态管理库如Redux进行更复杂的数据传递。理解并熟练...

    Silverlight参数传递

    - 在Silverlight中,可以通过`NavigationService`对象来实现页面间的导航以及参数传递。例如,在导航到新页面时,可以通过`Navigate`方法的第二个参数传递自定义的对象。 2. **依赖注入**: - 使用依赖注入框架...

    .net如何实现页面间的参数传递

    在.NET框架中,页面间的参数传递是Web应用程序开发中的常见任务。这主要涉及到HTTP协议的无状态特性,因为每次请求都是独立的,不保留任何上一次请求的信息。为了解决这个问题,.NET提供了多种方法来在不同的Web页面...

    JSF中文教程+JSF参数传递方式

    6. **导航案例**:JSF的导航系统允许你根据特定条件或动作结果来决定跳转到哪个页面,这过程中也可以传递参数。 **JSF中文教程** 提供了丰富的实例和详细解释,帮助初学者快速上手。通过学习这个教程,你将能够熟练...

    视图之间的参数传递

    在IT行业中,视图间的参数传递是一个常见的需求,特别是在开发多页面应用或单页应用(SPA)时。视图通常指的是应用程序中的一个显示单元,比如网页的一个部分或者一个单独的界面。视图间的通信是为了实现数据共享,...

    JSF参数传递doc

    在JavaServer Faces (JSF)框架中,参数传递是一个关键的操作,它允许数据在不同页面之间或者组件之间流动。JSF 提供了多种方法来处理参数传递,包括使用`&lt;f:param&gt;`标签、Managed Bean的属性绑定以及共享Request ...

    网页间参数的传递

    网页间参数传递是Web开发中的一个关键概念,它涉及到用户在浏览不同的网页时,如何保持信息的连贯性或在不同页面间交换数据。在Web应用程序中,这种传递通常发生在客户端(浏览器)和服务器端之间,或者在浏览器内部...

    Xamarin.Forms应用程序导航系统的帮助程序:传递参数、恢复_C#_下载.zip

    总之,这个压缩包提供的“Xamarin.Forms应用程序导航系统的帮助程序”是为了解决C#开发者在处理页面导航、参数传递和数据恢复时遇到的问题,通过优化和封装导航服务,提高了开发效率和应用的用户体验。对于Xamarin....

    【JavaScript源代码】Vue router传递参数并解决刷新页面参数丢失问题.docx

    **问题与解决:** 当页面刷新时,由于 `params` 不包含在 URL 查询字符串中,所以参数会丢失。为了解决这个问题,我们可以使用 `beforeRouteLeave` 钩子将参数存储在 `localStorage` 或 `sessionStorage` 中,然后...

    jsf传递参数的说明

    在JSF(JavaServer Faces)框架中,参数传递是页面交互和数据管理的重要部分。本文将详细介绍JSF中如何传递参数,主要关注使用`f:param`...通过熟练掌握这些技巧,开发者能够更好地在JSF应用中实现数据交互和页面导航。

    wp7——页面导航讲解

    **导航参数传递** 在导航到新的页面时,我们可能需要传递数据。这可以通过在Uri中添加查询字符串来实现,或者利用`NavigationContext.QueryString`属性在目标页面中获取。例如: ```csharp Uri uri = new Uri("/...

    window phone 8.1页面导航

    除了通过导航参数传递数据,还可以使用消息队列(如`Application.Current.RootVisual.Dispatcher`)、依赖属性或事件来实现在页面间通信。 10. **页面样式和模板** Windows Phone 8.1提供了一系列预定义的样式和...

    Windowsphone开发初体验之(三)-参数传递

    Windows Phone应用开发中的参数传递是一个广泛而灵活的主题,涵盖了从简单的页面导航到复杂的网络通信的各种情况。理解并熟练掌握这些技术,将有助于构建功能丰富、用户体验优秀的应用程序。在实际开发中,还应考虑...

    WPF 实现导航通过Frame的Navigate函数实现导航

    对于初学者,这是一个很好的起点,可以帮助理解WPF中页面导航的基本工作原理。通过深入学习和实践,你可以构建更复杂的应用,包括自定义的导航逻辑和更丰富的用户体验。在实际项目中,还可以考虑使用MVVM模式来更好...

Global site tag (gtag.js) - Google Analytics