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

1. Native

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

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



typedef struct tagADDRESS {

  
int nAddr0;

     
int nAddr1;

     
int nAddr2;

     
int nAddr3;

} ADDRESS;

 

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

 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) 在主对话框的头文件中,加入消息映射函数声明:

 

本地设备地址设置消息映射函数声明

 

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


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中,代码如下:

 defaultUser)

         {

              InitializeComponent();

 

              m_txtUserName.Text = defaultUser;

         }

 

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

);

              DialogResult r = f.ShowDialog();

 

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

 

b) 通过属性传递

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



         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之前,为其属性赋值,并且在对话框关闭之后,读取该属性的值,从而完成数据的传递。代码如下:

);

 

              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 Loginwindows mobile窗口之间传递数据的方法";

 

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

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



         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中合适的地方,即用户希望触发数据传递时,触发这个事件,代码如下:

)

                   this.Login(thisnew LoginEventArgs(m_txtUserName.Text));

 

              
this.DialogResult = DialogResult.OK;

 

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

);

 

              f.Login += new Form2.LoginEventHandler(f_Login);

              f.ShowDialog();

 

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

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

 

参考文献:

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

源代码下载:DataTransport.rar

 

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-09-20
  • 2022-12-23
  • 2022-12-23
  • 2021-11-30
  • 2022-12-23
猜你喜欢
  • 2021-10-25
  • 2021-10-14
  • 2021-06-14
  • 2021-07-23
相关资源
相似解决方案