下面简述Windows Phone共享数据的三种方法。
第一种方法:访问公共属性
在重写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类型的字典接口
该项目有两个页面:MainPage和SecondPage,各有三个button和三个textblock。代码如下:
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 }
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 }
发表回复