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

  • 常规讨论

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

    1. Native

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

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

    #defineWM_LOCALADDR_SET  WM_USER+21 //本地STC地址设置消息定义

    typedef struct tagADDRESS {

      int nAddr0;

        int nAddr1;

        int nAddr2;

        int nAddr3;

    } ADDRESS;

     

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

    voidCLocalAddrSet::OnButtonApply()

    {

            // TODO: Add your control notification handler code here

            UpdateData(TRUE);

            ADDRESSrp;

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

    afx_msgLRESULTLocalAddrSetPrco(WPARAMwParam,LPARAMlParam); //本地设备地址设置消息映射函数声明

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

    ON_MESSAGE(WM_LOCALADDR_SET,LocalAddrSetPrco)   //本地设备地址设置处理映射

    //本地地址设置

    LRESULTCSlaverDectorDlg::LocalAddrSetPrco(WPARAMwParam,LPARAMlParam)

    {

       ADDRESS*prp= (ADDRESS*)lParam;

            inti;

            intHEC=0;//头校验

        ……….

    }

     

    2. Managed

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

    a)使用构造器传递数据

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

            publicForm2(stringdefaultUser)

            {

                 InitializeComponent();

     

                 m_txtUserName.Text = defaultUser;

            }

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

                 Form2f =newForm2("guest");

                 DialogResultr = f.ShowDialog();

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

    b)通过属性传递

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

            #region使用属性

            publicstringUserName

            {

                 get

                 {

                      returnm_txtUserName.Text;

                 }

                 set

                 {

                      if(value==null)

                          m_txtUserName.Text =String.Empty;

                      else

                          m_txtUserName.Text =value;

                 }

            }

            #endregion

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

                 Form2f =newForm2("guest");

     

                 f.UserName = m_userName;

     

                 DialogResultr = 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)通过事件(参数)传递

    2009年6月30日 7:12

全部回复

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

            #region使用事件

            publiceventLoginEventHandlerLogin;

     

            publicclassLoginEventArgs:EventArgs

            {

                 stringm_userName;

     

                 publicstringUserName

                 {

                      get

                      {

                          returnm_userName;

                      }

                      set

                      {

                          if(value!=null)

                               m_userName =value;

                          else

                               m_userName =String.Empty;

                      }

                 }

     

                 publicLoginEventArgs(stringuserName)

                 {

                      this.UserName = userName;

                 }

            }

     

            publicdelegatevoidLoginEventHandler(objectsender,LoginEventArgse);

            #endregion

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

                 if(this.Login !=null)

                      this.Login(this,newLoginEventArgs(m_txtUserName.Text));

     

                 this.DialogResult =DialogResult.OK;

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

                 Form2f =newForm2("guest");

     

                 f.Login +=newForm2.LoginEventHandler(f_Login);

                 f.ShowDialog();

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

     

    2009年6月30日 7:12