在上一篇教程中我们了解了Spa工程的四大部件,在这一篇教程中,我们就开始逐步进入代码部分。这一节我主要讲界面生成的选项,为下一节创建实例程序做准备。
1. 选项类型概述
界面生成选项很好理解,正如它的名称所述,它就是为生成的界面提供配置设置参数。
整个界面生成的选项类型对应SpaObjectOption类型,在Mgen.Spa命名空间内。这个类型是这样被定义的:
这个类型很简单,有三个属性,分别代表三个配置选项。
Title属性最简单,它是对整个过程(或者说界面)的描述文字,比如生成的界面是登陆界面,那么Title属性就可以是“登陆”。注意在不同平台的界面中,它会以不同形式被显示,比如在WPF这种基于Windows窗体的程序中,Title属性会显示在对话框窗体的标题上,而在Windows Phone或WinRT这种基于Page的环境下,Title会显示成页面标题。
接下来我们来细看一下剩下两个属性。
2. 多语言资源存储
第二个讲的属性是关于多语言的资源存储配置,这个选项对应SpaObjectOption的ResourceProvider属性。
我们知道Spa工程是完全支持多语言化的,同一个数据,可以提供不同语言的编辑形式,如下:
那么为了实现这样的功能,任何代表界面文字的地方都需要以Key的形式存在,而每个语言的资源是在资源存储中的。当Spa工程去创建界面时,会从相应资源存储中找到相应的Key,并取出具体语言的具体值然后显示在界面上。
因此,资源存储的功能就是可以根据相应的Key找到相应语言的资源。需要的语言定义在当前线程的CurrentUICulture属性中(这属于.NET的内容)。Spa没有限定资源存储的具体执行,而是用一个接口定义资源存储的形态。
SpaObjectOption的ResourceProvider的属性针对类型就是IResourceProvider接口,代表一个资源存储类型,它在Mgen.Spa命名空间内,它是这样定义的:
namespace Mgen.Spa
{
public interface IResourceProvider
{
string GetString(string key);
string GetEnum(Enum e);
}
}
IResourceProvider接口定义两个方法:GetString和GetEnum。
GetString就是我们上面讲的,参数是Key,返回值是当前语言的相应文本。GetEnum我们在讲选择器控件后会讲,现在读者可以忽略掉它。
当然开发者不需要每次使用资源都需要自己继承IResourceProvider接口去实现。Spa工程提供了一个默认执行,DefaultResProvider类型,同样在Mgen.Spa命名空间内,这个类型的执行很简单:
public class DefaultResProvider: IResourceProvider
{
ResourceManager resmgr;
public DefaultResProvider(Type resType)
{
if (resType == null)
{
throw new ArgumentNullException("resType");
}
resmgr = new ResourceManager(resType);
}
public string GetString(string key)
{
return resmgr.GetString(key);
}
public string GetEnum(Enum e)
{
return resmgr.GetString(e.GetType().Name + "_" + e.ToString());
}
}
可以看到是通过一个Visual Studio生成的RESX资源类型来初始化DefaultResProvider类型,GetString方法的执行其实就用返回RESX资源内Key的值。而GetEnum的执行就是把枚举的类型名称和枚举值用“_”连接作为一个Key,然后从内部资源中获取语言文字。
3. 验证选项
最后一个介绍的选项就是验证选项,对应SpaObjectOption的ValidationOption属性,它对应的类型是ValidationOption类型,也在Mgen.Spa命名空间内。它包含3个子属性,我们分别进行细讲:
1. 验证触发选项:ValidationTrigger属性
验证触发选项定义控件什么时候进行验证。验证触发选项对应ValidationTrigger枚举(这个类似WPF中的ValidationTrigger),有如下选项:
PropertyChanged:每当用户改变了控件,验证执行。
LostFocus:当控件失去焦点后,验证执行。
Explicit:验证不会自动执行,需要开发者手动调用。(教程后面会讲到)
2. 加载后验证选项:OnloadValidation属性
加载后验证选项定义当Spa生成界面后是否立即进行验证。对应OnloadValidation枚举,选项有:
None:不进行验证
Required:进行验证
比如我们需要一个不为空的字符串,但是文本框默认就是空的。如果设置加载后不进行验证,那么界面显示后不会提示任何错误(因为没有发生验证):
而如果加载后验证被设置,那么界面显示后会立即验证:
3. 对象选项:ObjectOption属性
对象选项定义目标对象后的数据存储是否去更新,对应ObjectOption枚举,选项有:
New:界面上所有控件的值为空。
Edit:界面上的控件会读取背后核心的值。
这个也很好理解,其实就是告诉Spa你是想创建一个全新的界面,还是读取背后对象的数据来编辑它。注意ObjectOption和OnloadValidation的配合使用。
OK,界面选项这一部分还是很简单的,在下一节中我们会用到这一节学到的知识,然后定义类型,生成类型数据,绑定对象,最后生成界面创建各个平台的Spa工程Hello World程序。在教程第7部分,我们会根据示例,再讲一下这部分的内容。