windows phone 三种数据共享的方式(8)

简介:

 本 节实现的内容是数据共享,实现的效果描述:首先是建立两个页面,当页面MainPage通过事件导航到页面SecondPage是,我们需要将 MainPage中的一些内容(比如一个字符串)传递到SecondPage中,SecondPage页面就出呈现出传递来的内容,当页面 SecondPage通过事件导航到页面MainPage的时候,我们也把一些内容(比如一个字符串)传递与页面MainPage;

在建立的MainPage.xaml文件中我只添加了一个Button元素,设置显示的Content内容,并定义了该元素的触摸事件:

<Button x:Name= " btn " Content= " 导航到第二个页面 " Grid.Row= " 1 " Click= " btn_Click "></Button>

 MainPage的隐藏文件首先需要引用如下命名空间

// 引用命名空间--PhoneApplicationService类用到
using Microsoft.Phone.Shell;

MainPage的隐藏文件的全部代码如下:

View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
// 引用命名空间--PhoneApplicationService类用到
using Microsoft.Phone.Shell;

namespace ShareData
{
     public  partial  class MainPage : PhoneApplicationPage
    {
         //  构造函数
         public MainPage()
        {
            InitializeComponent();
        }
         ///   <summary>
        
///  点击导航到第二个页面
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private  void btn_Click( object sender, RoutedEventArgs e)
        {
             this.NavigationService.Navigate( new Uri( " /SecondPage.xaml ",UriKind.Relative));
        }
        // 知识点①
         protected  override  void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        {
             // 目标页--知识点②
             if (e.Content  is SecondPage)
            {
                ((SecondPage)e.Content).ApplicationTitle.Text =  " 传递数据成功! ";
            }
             // 获得application对象的引用--知识点③
            (Application.Current  as App).shareData =  " 通过APP类的属性共享数据 ";
             // 应用程序的状态管理---知识点④
            PhoneApplicationService.Current.State[ " Share "] =  " 临时数据 ";

             base.OnNavigatedFrom(e);
        }

         /// //  <summary>
        
/// // 接受传递的值
        
/// //  </summary>
        
/// //  <param name="e"></param>
         // protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        
// {
        
//      // 获得App类中的共享数据
        
//     PageTitle.Text = (Application.Current as App).shareData.ToString();
        
//     if (PhoneApplicationService.Current.State.ContainsKey("Share"))
        
//     {
        
//          // 获得phoneapplicationService对象中设置state属性
        
//         PageTitle.Text += "\n" + PhoneApplicationService.Current.State["Share"].ToString();
        
//     }
        
//     base.OnNavigatedTo(e);
        
// }
    }
}

 

 

 

 

 在建立的SecondPage.xaml文件中我只添加了一个Button元素,设置显示的Content内容,并定义了该元素的触摸事件:

<Button x:Name= " btn " Content= " 导航到第1个页面 " Grid.Row= " 1 " Click= " btn_Click "></Button>

 SecondPage的隐藏文件也需要引用相同的命名空间:

// 引用命名空间--PhoneApplicationService类用到
using Microsoft.Phone.Shell;

 

SecondPage的隐藏文件的全部代码如下:
View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
// 引用命名空间--PhoneApplicationService类用到
using Microsoft.Phone.Shell;

namespace ShareData
{
     public  partial  class SecondPage : PhoneApplicationPage
    {
         public SecondPage()
        {
            InitializeComponent();
        }
         ///   <summary>
        
///  接受传递的值
        
///   </summary>
        
///   <param name="e"></param>
         protected  override  void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
        {
             // 获得App类中的共享数据
            PageTitle.Text = (Application.Current  as App).shareData.ToString();
             if (PhoneApplicationService.Current.State.ContainsKey( " Share "))
            {    
                 // 获得phoneapplicationService对象中设置state属性
                PageTitle.Text +=  " \n " + PhoneApplicationService.Current.State[ " Share "].ToString();
            }
             base.OnNavigatedTo(e);
        }
         ///   <summary>
        
///  导航到第一个页面
        
///   </summary>
        
///   <param name="sender"></param>
        
///   <param name="e"></param>
         private  void btn_Click( object sender, RoutedEventArgs e)
        {
             this.NavigationService.GoBack(); ;
        }


         // protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
        
// {
        
//     if (e.Content is SecondPage)
        
//     {
        
//         ((SecondPage)e.Content).PageTitle.Text = "传递数据成功!";
        
//     }
        
//     (Application.Current as App).shareData = "通过APP类的属性共享数据";

        
//     PhoneApplicationService.Current.State["Share"] = "临时数据";

        
//     base.OnNavigatedFrom(e);
        
// }
  

 

我们三种传递参数的中的一种是利用App类下设置属性进行多个页面共享,直接在App类中设置的公共属性:

   // 设置共享的数据
         public  string shareData {  getset; }

 至 此全部代码已经呈现在这里,那我们是怎么进行数据共享的那,ok,详情如下:首先我们点击MainPage中的button事件,因为没有其他需要执行, 此是件执行完毕后会立即执行MainPage页面中的OnNavigatedFrom方法,我们可以看到OnNavigatedFrom的参数是 System.Windows.Navigation.NavigationEventArgs就是我们导航是的参数,OnNavigatedFrom方 法执行完毕后就会导航到SecondPage页,SecondPage的隐藏文件首先加载的就是构造函数,然后就是OnNavigatedTo方法,所以 我们在

OnNavigatedTo方法中接受传递来的数据;同样的原理我们可以把SecondPage中的数据传递到MainPage 中,代码中注释掉的部分就是实现该内容,其中MainPage隐藏文件中注释掉的部分,如果去除注释,在运行的时候就会报错,因为在程序进入 MainPage页面并触发Button事件后会执行OnNavigatedFrom方法,而此时并没有内容传递;

 

 

在此重写OnNavigatedFrom的方法是为了在此页面变为非活动页面的时候最后执行,所以有些操作可以在本页面进行完成;像我们这里的可以赋值于目标页面中TextBlock元素中的Text属性;

 

 

System.Windows.Navigation.NavigationEventArgs 参数就是记录了我们在点击导航时的一些信息,其中e.Content表示我们要导航到的页面,像这样 ((SecondPage)e.Content).ApplicationTitle.Text = "传递数据成功!";我们也访问目标也的属性

 

 

通 过App类来进行共享参数是因为在程序中所有的页面都可以访问Application派生的App类,在App类中设置的属性当然我们也可以访问,其中 Application类的静态属性Current返回的是Application对象的引用,如果想转换为派生的App类,强制转换即可

 

 PhoneApplicationService类的实例化在App.xaml文件中

View Code
<Application 
    x:Class= " ShareData.App "
    xmlns= " http://schemas.microsoft.com/winfx/2006/xaml/presentation "       
    xmlns:x= " http://schemas.microsoft.com/winfx/2006/xaml "
    xmlns:phone= " clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone "
    xmlns:shell= " clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone ">

    <!--应用程序资源-->
    <Application.Resources>
    </Application.Resources>

    <Application.ApplicationLifetimeObjects>
        <!--处理应用程序的生存期事件所需的对象-->
        <shell:PhoneApplicationService 
            Launching= " Application_Launching " Closing= " Application_Closing " 
            Activated= " Application_Activated " Deactivated= " Application_Deactivated "/>
    </Application.ApplicationLifetimeObjects>

</Application>

 

PhoneApplicationService类所提供的是对数据的暂时存储,只有在运行的时候才能保留( 独立存储空间是可以永久保留的),这个类的属性State可以设置的是字典容器,但是保存在State字典中的对象都必须是可序列化的,可序列化的意思是可以将对象转换成XML,XML也可以从中反序列化成对象

 

 

 页面最后加载的方法:OnNavigatedFrom方法;获取导航目标页:e.Content 并进行强制转换;访问App类的公共属性;PhoneApplicationService.State进行暂时的保存及读取;



本文转自shenzhoulong  51CTO博客,原文链接:http://blog.51cto.com/shenzhoulong/832671,如需转载请自行联系原作者

相关文章
|
12月前
|
开发工具 Windows
Windows平台RTMP推送|轻量级RTSP服务实现本地摄像头|屏幕|叠加数据预览
大家在做Windows平台RTMP推送或轻量级RTSP服务的时候,不管是采集屏幕还是采集摄像头,亦或屏幕摄像头的叠加模式,总会有这样的诉求,采集到的数据,希望能本地看看具体采集的数据或者图像实际效果,也就是本次介绍的“预览”功能。
220 0
|
2天前
|
计算机视觉 Windows Python
windows下使用python + opencv读取含有中文路径的图片 和 把图片数据保存到含有中文的路径下
在Windows系统中,直接使用`cv2.imread()`和`cv2.imwrite()`处理含中文路径的图像文件时会遇到问题。读取时会返回空数据,保存时则无法正确保存至目标目录。为解决这些问题,可以使用`cv2.imdecode()`结合`np.fromfile()`来读取图像,并使用`cv2.imencode()`结合`tofile()`方法来保存图像至含中文的路径。这种方法有效避免了路径编码问题,确保图像处理流程顺畅进行。
20 1
|
3天前
|
Linux 数据安全/隐私保护 Windows
Linux共享Windows目录
Linux共享Windows目录
|
7天前
|
缓存 NoSQL Linux
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
【Azure Redis 缓存】Windows和Linux系统本地安装Redis, 加载dump.rdb中数据以及通过AOF日志文件追加数据
|
14天前
|
Web App开发 存储 安全
微软警告数百万Windows用户:切勿冒险丢失所有数据
微软警告数百万Windows用户:切勿冒险丢失所有数据
微软警告数百万Windows用户:切勿冒险丢失所有数据
|
17天前
|
编解码 开发工具 C#
Windows电脑如何启动RTSP服务实现本地摄像头数据共享
本文介绍如何利用大牛直播SDK中的轻量级RTSP服务,在Windows平台上轻松采集摄像头数据并生成本地RTSP流。通过SDK提供的SmartPublisherDemo工具,用户能简便地选择摄像头、配置分辨率与帧率,并启动RTSP服务。此外,还支持音频采集、多端口服务以及动态水印等功能。生成的RTSP URL可用于其他终端拉流播放,无需额外部署服务器。该服务适配多种应用场景,如安防监控、电子教室等,并兼容Windows 7及以上版本。对于希望集成此功能的开发者,SDK提供了C++及C#接口,并支持多种编译模式。
|
4月前
|
Windows
如何使用Windows Media Player刻录数据DVD
Windows Media Player是微软Windows系统自带的多媒体播放器,支持多种音频、视频格式及图片查看,也能接收网络广播和刻录CD/DVD。用户可利用它管理媒体文件、创建播放列表。然而,其刻录DVD功能有限,仅适用于数据DVD。若需创建可在DVD播放机上播放的视频DVD,建议使用专业软件如DVDFab DVD Creator。
|
4月前
|
数据库 Windows
第五十章 使用 ^SystemPerformance 监视性能 - Microsoft Windows 平台的 InterSystems IRIS 性能数据报告
第五十章 使用 ^SystemPerformance 监视性能 - Microsoft Windows 平台的 InterSystems IRIS 性能数据报告
35 0
|
4月前
|
存储 Kubernetes 安全
虚拟机测试Windows Server 2016原地升级2019,应用和数据完美保留
Windows Server 2016可以无缝升级到2019版本,确保应用程序和数据在原地升级过程中完整保留。
227 0
|
4月前
|
关系型数据库 MySQL Java
windows下mybatis插入mysql数据中文乱码问题解决
windows下mybatis插入mysql数据中文乱码问题解决
149 0
下一篇
云函数