zoukankan      html  css  js  c++  java
  • 不同页面间参数的传递

    /*************************/

    //20101026 

    //不同页面间参数的传递

    /************************/

     

    在不同页面间导航的时候,有的时候需要传递参数,那么如何进行传递呢?这里我们将对这个问题进行讲解!

     

    创建两个页面,一个页面为page1.xaml,page2.xaml

    page1.xaml中添加一个页面,并定义它的时间为:

    private void button1_Click(object sender, RoutedEventArgs e)

            {

                NavigationService.Navigate(new Uri("/testForm/Page4.xaml?id=page3&name=xingchen", UriKind.Relative));

            }

     

    page2中也定义一个按钮,同样的定义它的单击事件为

    private void button1_Click(object sender, RoutedEventArgs e)

            {

                if (NavigationContext.QueryString.ContainsKey("id"))

                {

                           //应该先判断该参数是否是存在,然后在读取那个值,最后显示这个参数

                    id = NavigationContext.QueryString["id"].ToString();

                }

                if (NavigationContext.QueryString.ContainsKey("name"))

                {

                    name = NavigationContext.QueryString["name"].ToString();

                }

                MessageBox.Show("id=" + id + "/name=" + name);

            }

    Windows Phone 7 开发之页面间传值

    (下面的内容来自于博客:地址:http://www.devdiv.com/forum.php?mod=viewthread&tid=50936&archiver=1

    在页面间导航时传递参数的方式大致有3种,QueryString,全局变量和独立存储。独立存储还可用于在一个程序的多次执行中共享变量,我会在介绍独立存储的文章中说明。本文只介绍前两种传值方式。
    一.QueryString方式
            我沿用了上篇文章中的演示程序,去掉了页面1中的HyperlinkButton,并在页面2中添加一个文本框用以呈现数据。如下图: 

    我在页面1中的Button事件处理程序中添加了如下代码:
    代码
    private void btnMain_Click(object sender, RoutedEventArgs e)
    {
         string target = "/SubPage.xaml";
         target += string.Format("?InputText={0}", txtInput.Text);
         this.NavigationService.Navigate(new Uri(target, UriKind.Relative));
    }
    程序运行时这个Uri是这样的:”/SubPage.xaml?InputText=Hello, Windows Phone 7!” 它的形式和HTML中的查询字符串(Query String)一样,如果要传递多个参数,可以用&来合并,例如:”/SubPage.xaml?InputText=Hello, Windows Phone 7!&Name=Zhang Yin”。
    页面2中Button的Click事件处理程序代码如下:
    private void btnBack_Click(object sender, RoutedEventArgs e)
    {
         if (this.NavigationService.CanGoBack)
             this.NavigationService.GoBack();
    }
    并且我在页面2中重写了OnNavigatedTo方法。OnNavigatedTo方法是定义在Page类中的,所以 PhoneApplicationPage也继承了此方法,它是一个Virtual方法,所以需要用override关键字重写。 OnNavigatedTo在页面被创建后马上会被调用,也就是说在OnNavigatedTo 方法被调用时,页面的构造函数已经执行完毕了。类似的还有OnNavigatedFrom方法,它是在离开当前页面时触发的。
    页面2中OnNavigatedTo方法内的代码如下:
    代码
            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                string value = string.Empty;
                IDictionary<string, string> queryString = this.NavigationContext.QueryString;
                if (queryString.ContainsKey("InputText"))
                {
                    txt.Text = queryString["InputText"];
                }
                base.OnNavigatedTo(e);
            }
    Page 类定义了一个类型为NavigationContext的NavigationContext属性,它包含一个类型为 IDictionary<string, string>的QueryString属性。判空检测后,将InputText键对应的值赋给文本框的Text属性。最后触发基类的 OnNavigatedTo方法以保证基类的功能正常。当然也可以使用下面的代码,效果是一样的:
    代码
            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                string value = string.Empty;
                IDictionary<string, string> queryString = this.NavigationContext.QueryString;
                queryString.TryGetValue("InputText", out value);
                if (value != null)
                {
                    txt.Text = value;
                }
                base.OnNavigatedTo(e);
            }
    效果如下: 

    通过QueryString虽然可以向一个页面传递参数,但却无法回传数据,例如我在页面2中将文本修改为“Windows Phone 7!”,然后点击“前往第1页”按钮,得到的还是初始的那个页面,如下图: 

    要解决这个问题,就需要使用全局变量了。
    二.全局变量
        对于全局变量来说,我们可以在项目中添加一个在整个程序生命周期中都能访问到的类,将相应的数据保存在这个类的属性里。不过现在我们不用自己动手做这些额外的工作了。项目中本身就有一个类满足这个需求:App类。 App 类继承自Application类。通过Application的Current属性就可以获取到与当前程序关联的Application类实例,然后通 过转换就可以得到App类实例。程序中所有的页面都可以访问到这个App类,所以将我们要保存的数据放到App类中是最好不过了,免去了自己实现的麻烦。在App类中添加一个公有的InputText属性(C# 3.0的自动属性) :
    public partial class App : Application
    {
         public string InputText { get; set; }
         ……
    }
    页面1中的代码如下:
    代码
            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                App app = Application.Current as App;
                if (app.InputText != null)
                    txtPage1.Text = app.InputText;
                base.OnNavigatedTo(e);
            }
            protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
            {
                App app = Application.Current as App;
                app.InputText = txtPage1.Text;
                base.OnNavigatedFrom(e);
            }
    我在OnNavigatedTo方法内,读取App类的InputText值,为的是当在页面2中修改了文本后可以反映到页面1中。注意:OnNavigatedTo方法是在当前页面被激活(成为活动页面)时调用的。在OnNavigatedFrom方法中将文本框赋给App类的 InputText属性,供页面2去读取。
    页面2中的代码如下:
    代码
            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                App app = Application.Current as App;
                if (app.InputText != null)
                    txtPage2.Text = app.InputText;
                base.OnNavigatedTo(e);
            }
            protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
            {
                App app = Application.Current as App;
                app.InputText = txtPage2.Text;
                base.OnNavigatedFrom(e);
            }
    页面2中的操作与页面1类似。这样,当我们再次将页面2中的文本修改为“Windows Phone 7!”,然后点击“前往第1页”按钮时,就可以得到想要的结果了:

    三.PhoneApplicationService类
        类似于App类,我们还可以将要在多个页面中访问的数据保存在PhoneApplicationService的State属性中。它的类型是 IDictionary<string, object>,所以我们可以保存任意对象,不过前提是这个对象是可序列化的(serializable)。在程序中,我们无需自己创建 PhoneApplicationService的实例,通过PhoneApplicationService的静态属性Current就可以获取到已有的PhoneApplicationService实例。注意:在程序中访问PhoneApplicationService类需要添加下面的名称空间:
    using Microsoft.Phone.Shell;
    程序代码如下,页面1中的代码如下:
    代码
            protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                if (PhoneApplicationService.Current.State.ContainsKey("InputText"))
                {
                    txtPage1.Text = PhoneApplicationService.Current.State["InputText"] as string;
                }
                base.OnNavigatedTo(e);
            }
            protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
            {
                PhoneApplicationService.Current.State["InputText"] = txtPage1.Text;
                base.OnNavigatedFrom(e);
            }
    页面2中的代码如下:
    代码
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
            {
                if (PhoneApplicationService.Current.State.ContainsKey("InputText"))
                {
                    txtPage2.Text = PhoneApplicationService.Current.State["InputText"] as string;
                }
                base.OnNavigatedTo(e);
            }
            protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
            {
                PhoneApplicationService.Current.State["InputText"] = txtPage2.Text;
                base.OnNavigatedFrom(e);
            }
    四.关于OnNavigatedTo和OnNavigatedFrom方法
        我觉得这两个方法的名字起的不太好,有时候容易混淆,如果把OnNavigatedTo改为 OnNavigatedToThisPageFromOther,把OnNavigatedFrom改为 OnNavigatedFromThisPageToOther就会很清晰了,当然这只是帮助我们记忆的一种方法了。下面是MSDN中对这两个方法的一些建议:
    OnNavigatedTo:重写 OnNavigatedTo 方法以检查导航请求并且准备供显示的页面。例如,可以加载请求的数据并且启用或禁用可视化元素。通常是使用 OnNavigatedTo 方法,而非为 Loaded 事件创建事件处理程序。最好使用 OnNavigatedTo 方法,因为只在每次页面成为活动页面时调用该方法一次。Silverlight 框架在每次将元素添加到可视化树时引发 Loaded 事件,在激活某一页面时该事件可能会多次发生。
    OnNavigatedFrom:重写 OnNavigatedFrom 方法以便在页面成为非活动时对该页面执行最后的操作。例如,可以更新与该页面相关的数据。通常是使用 OnNavigatedFrom 方法,而非为 Navigated 事件创建事件处理程序。最好使用 OnNavigatedFrom 方法,因为不必再从 NavigationService 对象移除事件处理程序以避免对象生存期问题。

  • 相关阅读:
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_10 斗地主案例(双列)_1_斗地主案例的需求分析
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_09 Debug调试_1_Debug追踪
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_11_JDK9对集合添加的优化_of方法
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_9_Hashtable集合
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_8_LinkedHashMap集合
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_7_HashMap存储自定义类型键值
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_6_Map集合遍历键值对方式
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_4_Map集合遍历键找值方式
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_3_Map接口中的常用方法
    阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_2_Map常用子类
  • 原文地址:https://www.cnblogs.com/xingchen/p/1969541.html
Copyright © 2011-2022 走看看