在Smobiler开发过程中,大家经常会对窗体的跳转,显示,关闭,生命周期存在一些不明白的地方,这篇文章主要用来说明Smobiler窗体。
Smobiler Form
- 和WindowsForm编程一样,在手机上显示的界面在Smobiler就是一个窗体,使用Show方法打开新的Smobiler窗体时,在客户端上也会打开新的界面,Smobiler的窗体是带状态的,也就是说你在窗体上定义的变量在每次客户端处理的时候都是保持的,关闭界面回到上一个界面时,上一个界面的状态变量也会维持,这里和Web的Page是不一样的,Web的Page在每一次显示的时候都需要重新刷新(就像后退一样)。
Smobiler 窗体堆栈
和Android一样,Smobiler窗体也是使用堆栈的方式,即使用Show方法会将新的窗体入栈,使用Close方法会将窗体出栈并显示栈顶的窗体,下面来说明这个过程。
- 每一个Smobiler应用都包含了一个起始的窗体,这里我们使用SmobilerForm1来表示第一个窗体。
- 在SmobilerForm1中调用方法
this.Show(new SmobilerForm2());
时就会打开SmobilerForm2窗体,这时会将SmobilerForm2窗体入栈,即在栈顶,这时手机界面上也会显示为SmobilerForm2的窗体。
- 在SmobilerForm2窗体上调用方法
this.Show(new SmobilerForm3());
打开SmobilerForm3这个窗体,同上面的过程,会将SmobilerForm3窗体入栈。
- 在SmobilerForm3上调用
this.Close()
,这时会将SmobilerForm3出栈,这时栈顶为SmobilerForm2,此时手机界面上也会显示SmobilerForm2的界面。
- 说明
- Smobiler窗体堆栈有限制,默认为10层,最大50层,原因是由于每一个窗体都占用一定的内存,过多的窗体栈会导致内存增加过快,并且存在大量无效的窗体。所以如果从A-B再回到A窗体时,使用Close方法关闭B窗体即可回到A窗体,不要从B窗体再使用Show方法显示A窗体。
- Smobiler窗体是严格基于堆栈的,不允许跨栈访问,窗体的关闭必须按顺序出栈,比如A-B-C,如果回到A窗体,必须先关闭C,再关闭B
- 代码示例 https://github.com/comsmobiler/BlogsCode/tree/master/Source/BlogsCode_SmobilerForm
Smobiler 窗体生命周期
一个窗体被打开到关闭会经历如下生命周期
- Load 在窗体第一次被装载时触发此事件(一个窗体只会触发一次此事件)
- Deactivate 在打开新的窗体时,当前窗体会触发Deactivate事件,代表当前窗体没有被激活。
- Activated 打开的窗体关闭时,会回到当到当前窗体触发Activated事件,代表当前窗体被激活了。
- Closing 窗体关闭时的事件。可在此事件中取消关闭操作。
- Closed 窗体关闭后的事件。
Smobiler 窗体传值
- 为窗体界面传值时,可通过以下几个方式
- 构造函数。在构建函数中切记需要调用当前的默认构造函数,即在新的构造函数后面加上
:this()
this.Client.Session
,但是不要使用静态变量(static声明的变量),静态变量是所有客户端共享的,而this.Client.Session
是当前客户端所有界面共享的。不会影响其它客户端。- 在窗体上创建Public的属性,并为属性赋值。
- 构造函数。在构建函数中切记需要调用当前的默认构造函数,即在新的构造函数后面加上