本帖最后由 棕榈 于 2020-1-5 21:25 编辑
基于FineUI的PropertyGrid
属性网格对于从事WinForm开发的程序员来说应该是相当熟悉的了,但在Web开发中几乎看不到它的身影,这么方便的工具为什么在Web开发中很少用到呢,这背后的原因有很多,这里也不作讨论。平时我们并不能用到它,那我为什么还要做这一个组件呢,这与我正在开发的可视化设计器有关,它将用于设计器中的属性设置部分,这款设计器包含UI设计、EF实体设计、流程图设计,设计器的界面采用FineUI实现,关于设计器的详细信息以后会有介绍。
属性网格的数据包含两部分,一部分是类型定义,另一部分是对象数据
类型定义:采用的是JsonSchema,用它定义及约束类型,它的格式大概是这样的,由于完整的代码太多,这里只是部分
- {
- "definitions": {},
- "$schema": "http://json-schema.org/draft-07/schema#",
- "$id": "http://example.com/root.json",
- "type": "object",
- "title": "The Root Schema",
- "required": ["SingleLine", "Integer", "Number", "Date", "Color"],
- "properties": {
- "SingleLine": {
- "$id": "#/properties/SingleLine",
- "type": "string",
- "title": "输入单行文本",
- "default": "单行文本",
- "examples": ["单行文本"]
- },
- "Multiline": {
- "$id": "#/properties/Multiline",
- "type": "string",
- "title": "输入多行文本",
- "format": "multiline",
- "default": "",
- "examples": ["多行文本"]
- },
- "Description": {
- "$id": "#/properties/Description",
- "type": "string",
- "title": "描述HTML格式,<a href='http://wwww.baidu.com'><b>单击</b>查看详情</a>",
- "default": "描述",
- "examples": ["描述"]
- },
- "DropdownList2": {
- "$id": "#/properties/DropdownList2",
- "type": "string",
- "title": "多选下拉下列表且名称与值为不同的值",
- "format": "dropdownlist",
- "multiSelect": true,
- "dropdownlist": [
- ["value1", "item1"],
- ["value2", "item2"],
- ["value3", "item3"],
- ["value4", "item4"],
- ["value5", "item5"]
- ],
- "default": "value2,value3",
- "examples": ["value1,value2"]
- },
- ...
- ...
- ...
- ...
- "DropdownList4": {
- "$id": "#/properties/DropdownList4",
- "type": "string",
- "title": "下拉下列可编辑输入且强制选择",
- "format": "dropdownlist",
- "editable": true,
- "dropdownlist": [
- ["value1", "item1"],
- ["value2", "item2"],
- ["value3", "item3"],
- ["value4", "item4"],
- ["value5", "item5"]
- ],
- "default": "value3",
- "examples": ["value1"]
- },
- "Number": {
- "$id": "#/properties/Number",
- "type": "number",
- "title": "输入小数",
- "minimum": -100,
- "maximum": 100,
- "default": 60.8,
- "examples": [0.1]
- },
- "Size": {
- "$id": "#/properties/Size",
- "type": "object",
- "title": "大小对象包含宽度与高度",
- "required": ["Width", "Height"],
- "text": ["{0},{1}", "Size-Width", "Size-Height"],
- "default": "20,20",
- "properties": {
- "Width": {
- "$id": "#/properties/Size/properties/Width",
- "type": "integer",
- "title": "Width",
- "minimum": 0,
- "maximum": 500,
- "default": 20,
- "examples": [200]
- },
- "Height": {
- "$id": "#/properties/Size/properties/Height",
- "type": "integer",
- "title": "Height",
- "minimum": 0,
- "maximum": 500,
- "default": 20,
- "examples": [100]
- }
- }
- },
- "Array": {
- "$id": "#/properties/Array",
- "type": "array",
- "title": "字符串数组类型",
- "items": {
- "$id": "#/properties/Array/items",
- "type": "string",
- "title": "字符串",
- "default": "",
- "examples": ["string1", "string2", "string3", "string4", "string5"]
- }
- }
- ...
- ...
- ...
- }
- }
复制代码
这是Number类型的定义
- "Number": {
- "$id": "#/properties/Number",
- "type": "number",
- "title": "输入小数",
- "minimum": -100,
- "maximum": 100,
- "default": 60.8,
- "examples": [0.1]
- }
复制代码
这是下拉列表类型的定义
- "DropdownList4": {
- "$id": "#/properties/DropdownList4",
- "type": "string",
- "title": "下拉下列可编辑输入且强制选择",
- "format": "dropdownlist",
- "editable": true,
- "dropdownlist": [
- ["value1", "item1"],
- ["value2", "item2"],
- ["value3", "item3"],
- ["value4", "item4"],
- ["value5", "item5"]
- ],
- "default": "value3",
- "examples": ["value1"]
- }
复制代码
这是Size对象的定义
- "Size": {
- "$id": "#/properties/Size",
- "type": "object",
- "title": "大小对象包含宽度与高度",
- "required": ["Width", "Height"],
- "text": ["{0},{1}", "Size-Width", "Size-Height"],
- "converter": "(function(){if(data&&typeof data=='string'&&data.length>0) ...",
- "default": "20,20",
- "properties": {
- "Width": {
- "$id": "#/properties/Size/properties/Width",
- "type": "integer",
- "title": "Width",
- "minimum": 0,
- "maximum": 500,
- "default": 20,
- "examples": [200]
- },
- "Height": {
- "$id": "#/properties/Size/properties/Height",
- "type": "integer",
- "title": "Height",
- "minimum": 0,
- "maximum": 500,
- "default": 20,
- "examples": [100]
- }
- }
- }
复制代码
对象数据:采用的是Json,代码如下:
- {
- "SingleLine": "单行文本",
- "DropdownList": "item1",
- "DropdownList2": "value1,value2",
- "DropdownList3": "value3",
- "DropdownList4": "value4",
- "Boolean": false,
- "Integer": 50,
- "Number": 60.8,
- "Color": "#CCCCCC",
- "Size": {
- "Width": 200,
- "Height": 100
- },
- "Padding": {
- "Left": 10,
- "Top": 20,
- "Right": 10,
- "Bottom": 20
- },
- "Object": {
- "Name": "Address",
- "Type": "string",
- "IsNull": false,
- "Remark": "家庭住址"
- },
- "Array": ["string1", "string2", "string3", "string4", "string5"],
- "KeyValuePair": [{
- "key": "Key1",
- "value": "Value1"
- },
- {
- "key": "Key2",
- "value": "Value2"
- },
- {
- "key": "Key3",
- "value": "Value3"
- },
- {
- "key": "Key4",
- "value": "Value4"
- },
- {
- "key": "Key5",
- "value": "Value5"
- }
- ]
- }
复制代码
关于JsonSchema网上介绍它的文章有很多,大家可以百度搜索,有什么不明白的可以留言。
属性网格是在FineUI的树组件上构建的,搜索栏是一个工具栏,描述栏也是一个工具栏,中间是一个树的主体部分。
搜索栏,可以通过输入属性名称的部分信息来过虑属性
描述栏,当选择一个属性时将显示属性的描述信息,描述信息支持HTML格式
属性编辑器,包含大多数常用的编辑器,如:
1、单选文本
2、多行文本
3、下拉选择(单选、多选、输入等)
4、枚举
5、布尔型
6、整数
7、小数
8、日期
9、颜色
10、对象类型
11、文本数组
12、键值对数组
13、文件上传
后续会根据设计器的需求,再增加一些编辑器
为了配合属性网格的使用,对部分编辑器做了一些增强
1、每一个编辑器的清除按钮是用于将属性重置到默认值,为了保持统一,对数字输入框添加了清除按钮
2、为了便于输入多行文本,增加了一个下拉的多行文本输入框
3、引入了一个第三方的颜色拾取器,并对其增加了下拉功能,下拉效果是用FineUI来实现的
4、可以直接编辑对象或编辑对象属性,如Size对象,对象的编辑及显示是通过JsonSchema来定义的
5、提供了一个键值对数组的编辑器,可以对其进行添加、删除、上移、下移等操作
属性网格的实现将大大方便了设计器的操作,大家对基于FineUI的可视化设计器有什么想法,可以留言给我。
|