windows mobile窗口之间传递数据的方法

    在windows mobile上设计UI的时候,经常会碰到多个窗口的情况。有时候,我们需要将一个窗口中的用户输入信息反应到另一个窗口中去,这就涉及到窗口之间的数据传递问题。下面就分native和managed这两种方式来讲讲这个窗口之间数据传递的方法。

1. Native

    这个方法是当时我在看MFC时学到的,当时应用的场景是这样的。我建立了一个基于对话框的应用程序(Dialog-based),一些参数设置需要另外一个对话框来呈现给用户,在用户输入完之后,就需要将数据传递给主对话框。当时我是这么实现的:

a) 在 stdafx.h头文件中,加入用户定义消息和传递的数据结构,如:

Code
 #define WM_LOCALADDR_SET   WM_USER+21 //本地STC地址设置消息定义
 
 typedef struct tagADDRESS {
 
 int nAddr0;
 
 int nAddr1;
 
 int nAddr2;
 
 int nAddr3;
 
 } ADDRESS;
 

b) 在地址设置对话框的实现文件中,加入“OK”按钮的消息处理函数:

Code
 void CLocalAddrSet::OnButtonApply() 
 
 {
 
 // TODO: Add your control notification handler code here
 
          UpdateData (TRUE);
 
          ADDRESS rp;
 
          rp.nAddr0 = m_intLocalAddr0;
 
          rp.nAddr1 = m_intLocalAddr1;
 
          rp.nAddr2 = m_intLocalAddr2;
 
         rp.nAddr3 = m_intLocalAddr3;
 
 //发送消息
 
          AfxGetMainWnd ()->SendMessage (WM_LOCALADDR_SET, 0, (LPARAM) &rp);
 
        }
 

c) 在主对话框的头文件中,加入消息映射函数声明:

Code
 afx_msg LRESULT LocalAddrSetPrco(WPARAM wParam, LPARAM lParam); //本地设备地址设置消息映射函数声明

d) 在主对话框文件(.cpp)中,加入消息映射和对应的实现函数:

Code
 ON_MESSAGE(WM_LOCALADDR_SET,LocalAddrSetPrco)    //本地设备地址设置处理映射
 
 //本地地址设置
 
 LRESULT CSlaverDectorDlg::LocalAddrSetPrco(WPARAM wParam, LPARAM lParam)
 
 {
 
     ADDRESS* prp = (ADDRESS*) lParam;
 
 int i;
 
 int HEC=0;//头校验
 
      ……….
 
 }

2. Managed

    Managed方式中,有三种方法,分别是:使用构造器传递数据、通过属性传递和通过事件(参数)传递。具体可以参考《windows mobile 平台应用与开发》7.2节。

a) 使用构造器传递数据

   使用构造器可以向一个新窗体传递初始值,如在主窗体Form1的基础上创建Form2,我们就可以在Form2的构造函数中,接收一个初始的值,并显示在对应的label中,代码如下:

Code
  public Form2(string defaultUser)
 
          {
  InitializeComponent();
 
 
 
               m_txtUserName.Text = defaultUser;
 
          }
 

   在Form1中,我们可以使用如下的方法来创建Form2:

Code
               Form2 f = new Form2("guest");
 
               DialogResult r = f.ShowDialog();
 

   这样就把guest信息传递到了Form2中。

b) 通过属性传递

   向Form2添加属性,通过为属性赋值和读取属性值来进行数据传递。首先为Form2添加公共属性,代码如下:

Code
  #region 使用属性
 
 public string UserName
 
          {
 
 get
 
               {
 
 return m_txtUserName.Text;
 
               }
 
 set
 
               {
 
 if(value == null)
 
                        m_txtUserName.Text = String.Empty;
 
 else
 
                        m_txtUserName.Text = value;
 
               }
 
          }
 
 #endregion
 
 

然后在Form1中,显示Form2之前,为其属性赋值,并且在对话框关闭之后,读取该属性的值,从而完成数据的传递。代码如下:


Code
              Form2 f = new Form2("guest");
 
 
 
               f.UserName = m_userName;
 
 
 
               DialogResult r = f.ShowDialog();
 
 if(r == DialogResult.OK)
 
               {
 
                    m_userName = f.UserName;
 
                    m_lblMessage.Text = String.Format("Hello, {0}!", f.UserName);
 
               }
 
 else
 
                    m_lblMessage.Text = "Please Login

";
 
 

c) 通过事件(参数)传递

   首先,给Form2添加事件参数类型和事件处理委托的定义,代码如下:


Code
  #region 使用事件
 
 public event LoginEventHandler Login;
 
 
 
 public class LoginEventArgs : EventArgs
 
          {
 
 string m_userName;
 
 
 
 public string UserName
 
               {
 
 get
 
                    {
 
 return m_userName;
 
                    }
 
 set
 
                    {
 
 if(value != null)
 
                             m_userName = value;
 
 else
 
                             m_userName = String.Empty;
 
                    }
 
               }
 
 
 
 public LoginEventArgs(string userName)
 
               {
 
 this.UserName = userName;
 
               }
 
          }
 
 
 
 public delegate void LoginEventHandler(object sender, LoginEventArgs e);
 
 #endregion
 
 

   然后,在Form2中合适的地方,即用户希望触发数据传递时,触发这个事件,代码如下:

Code
  if(this.Login != null)
 
 this.Login(this, new LoginEventArgs(m_txtUserName.Text));
 
 
 
 this.DialogResult = DialogResult.OK;
 

   同样,在Form1中,除了需要创建并显示Form2之外,还要为Form2的对象添加一个事件处理方法,代码如下:


Code
               Form2 f = new Form2("guest");
 
 
 
               f.Login += new Form2.LoginEventHandler(f_Login);
 
               f.ShowDialog();
 

上面讲述的三种方法,效果都是一样的,如下图所示:

参考文献:

刘彦博等著《Windows Mobile平台应用与开发》 人民邮电出版社

源代码下载:DataTransport.rar

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(30)-本地化(多语言)

我们的系统有时要扩展到其他国家,或者地区,需要更多的语言环境,微软提供了一些解决方案,原始我们是用js来控制的,现在不需要了。 我们只要创建简单的资源文件,通过...

35570
来自专栏Ken的杂谈

C# MD5加密-MD5Helper

3.7K30
来自专栏魂祭心

原 WCF学习之旅----基础篇之Ente

28260
来自专栏技术博客

Asp.Net Web API 2第九课——自承载Web API

阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.h...

10130
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(21)-权限管理系统-跑通整个系统

这一节我们来跑通整个系统,验证的流程,通过AOP切入方式,在访问方法之前,执行一个验证机制来判断是否有操作权限(如:增删改等) 原理:通过MVC自带筛选器,在筛...

78970
来自专栏Phoenix的Android之旅

JSONObject 和 JsonObject 的区别

做Java开发经常要用Json来做数据的格式化解析,虽然在Android平台上我们习惯的使用 JSONObject, 但不知道你有没有这样的疑问,我们在impo...

26910
来自专栏听雨堂

用Nunit测试通讯程序

    对于Nunit,我是个纯粹的新手,没想到,第一个练手的,居然是一个通讯程序。难度略微大了点。我的通讯程序是一个类似通讯服务器的程序,能够监听和维持多个连...

20470
来自专栏开发 & 算法杂谈

Hiredis源码阅读(二)

上一篇介绍了Hiredis中的同步api以及回复解析api,这里紧接着介绍异步api。异步api需要与事件库(libevent、libev、ae一起工作)。

47250
来自专栏技术博客

菜菜从零学习WCF九(会话、实例化和并发)

在服务协定上设置System.ServiceModel.ServiceContractAttribute.SessionMode值

11030
来自专栏木宛城主

ASP.NET那点不为人知的事(二)

上一篇博文《ASP.NET那点不为人知的事(一)》中我们提到HttpApplication有19个标准事件,在HttpApplication的第8个事件P...

23250

扫码关注云+社区

领取腾讯云代金券