• windows phone 学习之三种共享数据的方式


    上篇文章简述了如果通过在uri后面添加参数来达到传递参数的目的,有时候不仅仅是需要传递数据,而是共享数据,又该如何?下面简述共享数据的三种方法。

    第一种方法:访问公共属性

    在重写protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)方法时,参数 e 包含了大量的数据,其中e.Content表示将要导航到的页面,可以直接通过e.Content来访问将要导航到的页面的公共全局变量。如 (e.Content as SecondPage).textBlock1.Text = "ddd";

    第二种方法:使用App类

    首先要知道,程序中所有页面都可以访问到从Application派生的App类,可以通过往App类添加属性、字段等来作为各个页面都可以访问的共享数据。访问Application类的静态属性Current可以返回当前应用程序的Application对象,Current 属性返回对 Application 对象的引用,而非从 Application 派生的类的实例。如果您需要直接访问后者,则需要将由 Current 返回的值强制转换为从 Application 派生的类的类型,如 (Application.Current as App).Str = "eee"; 其中Str是额外添加到App类的: public partial class App : Application     {     public string Str { set; get; }   }

    第三种方法:使用PhoneApplicationService对象的State属性

    PhoneApplicationService对象的State属性 是 IDictionary<string, object>类型的字典接口

    该项目有两个页面:MainPage和SecondPage,各有三个button和三个textblock。代码如下:

    View Code
     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Net;
    5 using System.Windows;
    6 using System.Windows.Controls;
    7 using System.Windows.Documents;
    8 using System.Windows.Input;
    9 using System.Windows.Media;
    10 using System.Windows.Media.Animation;
    11 using System.Windows.Shapes;
    12 using Microsoft.Phone.Controls;
    13 using Microsoft.Phone.Shell;
    14
    15 namespace WPApp_Navigation
    16 {
    17 //为类App添加一个公共属性.程序中所有页面都可以访问到从Application派生的App类
    18 public partial class App : Application
    19 {
    20 public string Str { set; get; }
    21 }
    22
    23 public partial class MainPage : PhoneApplicationPage
    24 {
    25 // 构造函数
    26 public MainPage()
    27 {
    28 InitializeComponent();
    29 this.button1.Click += new RoutedEventHandler(button1_Click);
    30 }
    31
    32 void button1_Click(object sender, RoutedEventArgs e)
    33 {
    34 //赋给Uri的字符串参数中间别留空格,多个参数中间用&连起来
    35 this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.RelativeOrAbsolute));
    36 }
    37
    38 //重写基类的OnNavigateFrom方法,离开此页面时触发
    39 protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    40 {
    41 //参数 e 表示为导航方法提供的数据
    42 base.OnNavigatedFrom(e);

    43
    44 //第一种方法:访问公共属性
    45 //e.Content 表示正在导航到的目标
    46 if (e.Content is SecondPage)

    47 {
    48 (e.Content as SecondPage).textBlock1.Text = "ddd";
    49 }
    50
    51 //第二种方法:通过App类中的公共属性
    52 //Current 属性返回对 Application 对象的引用
    53 (Application.Current as App).Str = "eee";

    54
    55 //第三种方法:使用PhoneApplicationService对象的State属性
    56 PhoneApplicationService.Current.State["s6"] = "fff";

    57 }
    58
    59 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    60 {
    61 base.OnNavigatedTo(e);
    62
    63 this.textBlock2.Text = (Application.Current as App).Str;
    64
    65 if (PhoneApplicationService.Current.State.ContainsKey("s6"))
    66 {
    67 this.textBlock3.Text = (string)(PhoneApplicationService.Current.State["s6"]);
    68 }
    69
    70 }
    71 }
    72 }
    View Code
     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Net;
    5 using System.Windows;
    6 using System.Windows.Controls;
    7 using System.Windows.Documents;
    8 using System.Windows.Input;
    9 using System.Windows.Media;
    10 using System.Windows.Media.Animation;
    11 using System.Windows.Shapes;
    12 using Microsoft.Phone.Controls;
    13 using Microsoft.Phone.Shell;
    14
    15 namespace WPApp_Navigation
    16 {
    17 public partial class SecondPage : PhoneApplicationPage
    18 {
    19 public int a = 0;
    20 int b = 1;
    21 public SecondPage()
    22 {
    23 InitializeComponent();
    24 this.button1.Click += new RoutedEventHandler(button1_Click);
    25 }
    26
    27 void button1_Click(object sender, RoutedEventArgs e)
    28 {
    29 //返回上一个页面
    30 this.NavigationService.GoBack();
    31 }
    32
    33 //当该页面是活动页面时触发
    34 protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    35 {
    36 base.OnNavigatedTo(e);//调用基类的虚方法是应该的,但不是必须的
    37
    38 this.textBlock2.Text = (Application.Current as App).Str;
    39
    40 if (PhoneApplicationService.Current.State.ContainsKey("s6"))
    41 {
    42 this.textBlock3.Text = (string)PhoneApplicationService.Current.State["s6"];
    43 }
    44
    45 }
    46
    47 //当该页面不是活动页面时触发
    48 protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
    49 {
    50 base.OnNavigatedFrom(e);
    51
    52 //离开此页面前,该页面也可以通过三种方式来传递数据给下一个页面
    53 if (e.Content is MainPage)
    54 {
    55 (e.Content as MainPage).textBlock1.Text = "123";
    56 }
    57
    58 (Application.Current as App).Str = "456";
    59
    60 PhoneApplicationService.Current.State["s6"] = "789";
    61 }
    62 }
    63 }



  • 相关阅读:
    转:一道笔试题-将int型数组强制转换为char*,再求strlen,涉及大小端
    转:git windows中文 乱码问题解决汇总
    git教程1
    刘汝佳黑书 pku等oj题目
    C/C++ qsort()快速排序用法
    char s[]字串和char *s字串有什麼区别?
    c语言‘’ ,‘0’, “0” ,0之间的区别
    带符号的char类型取值范围为什么是-128——127
    c语言memset详解
    【线性规划与网络流24题】孤岛营救问题 分层图
  • 原文地址:https://www.cnblogs.com/zouzf/p/2406914.html
Copyright © 2020-2023  润新知