基于Extjs的web表单设计器 第三节——控件拖放
看过之前设计器截图的朋友应该有印象,可能会发觉我们的设计器UI设计布局其实类似Visual studio 的设计界面,采用的是左、中、右三个区域布局。左侧为控件区域、中间为表单的画布设区域、右侧为属性区域。这样的UI设计肯定就得支持控件的拖拽设计,用户只要拖放一个控件到我们的画布上,那么画布就应该立即能够看到我们拖放的控件在画布中的位置、大小、以及一些控件自带的默认信息。不用说这样的设计对于用户来说不论在操作体验上还是设计的感官上都更加直接和方便,因为我在设计阶段就可以知道我设计后的表单在系统运行时候的样子(What i see is what i get)。这个设计相对于我们1.0版本的设计器来说应该是很大的进步,要知道在1.0时代我们的设计器可是一个通过弹出框,然后在弹出框的下拉控件列表去选择控件类型,然后配置其他的xx属性......然后所有控件显示到一个grid列表中的,用户更不不知道这个表单是什么样子,还需要借助预览功能才能查看表单的样子。
我们的设计器既然要采用类似VS设计器的方式,那么我们也就必须解决一些比较重要的问题。
- 首先来说就是必须要支持控件的拖拽设计,也就是当用户进入我们的设计器界面,选择了左侧的某个控件后能够拖放到我们设计器的中间画布“指定”区域(注意是指定的位置,不是顺便一个位置)。
- 然后就是不同区域支持的控件类型可能不一样,那么我们就必须限定每个类型的区域控件能够支持哪些控件。也就是当一个被区域支持的控件拖放到我们的区域上面并释放鼠标后那么我们的区域就得接受该控件,如果是不被支持的控件拖放到我们的区域上面并释放鼠标后我们的区域控件不会有任何响应。
- 同一个区域内部的控件支持随意的交换位置,用户可在一个区域内部通过拖放控件来改变控件的位置。
- 我们的区域之间能够支持控件的拖放,比如将一个A区域的控件移动到B区域中区。也就是区域之间可以随意交换控件。
上面的几个问题是我们采用拖拽式表单设计器必须解决的问题,如何解决呢?通过研究extjs API 我们可以发现,对于extjs treepanel类型控件我们在它的view里面添加一个支持树节点拖放的treeviewdragdrop插件,实现代码如下:(请对比Ext.net 的写法和 纯extjs的写法上的区别.其实它们本质上是一样的,Ext.Net的代码在经过服务器解析之后生成的代码其实和纯extjs写的代码几乎一样。只是Ext.Net对.Net开发人员来说使用起来更方便,更熟悉,仅此而已.)
<ext:TreePanel ID="controlRegion" Title="表单控件" runat="server" Region="West" RootVisible="false"
Width="200" Split="true" Collapsible="true" Collapsed="false">
<Store>
...........................略
</Store>
<Root>
...........................略
</Root>
<View>
<ext:TreeView ID="TreeView1" runat="server">
<Plugins>
<ext:TreeViewDragDrop runat="server" EnableDrop="true" DragGroup="tree2div" />
</Plugins>
</ext:TreeView>
</View>
</ext:TreePanel>
Ext.Net 写法
Ext.create("Ext.tree.Panel",
{
store: { //.........略 },
id: "TreePanel1",
width: 200,
region: "west",
split: true,
collapsible: true,
title: "表单控件",
viewConfig: {
id: "TreeView2",
plugins: [
{
ptype: "treeviewdragdrop",
dragGroup: "tree2div"
}
],
xtype: "treeview"
},
root: { //.........略 },
rootVisible: false
})
extjs 写法
请注意代码中的包含treeviewdragdrop部分的代码,它的加入表示我们的树节点可以支持拖放了,但是仅仅这样还是远远不够的。我们还必须为我们设计器的画布提供接收拖放功能的代码,这里我们给出画布区域的代码和对画布支持拖放的代码。
我们的设计器代码中加入一个画布的panel ,结合前面一章节的介绍大家应该知道我们的画布其实是一个Mixed类型的混合区域控件。
<ext:Panel ID="mainPanel" runat="server" Region="Center" ButtonAlign="Center" Border="true"
BodyPadding="10" OverflowY="Auto">
<CustomConfig>
<ext:ConfigItem Name="type" Value="Mixed" Mode="Value" />
</CustomConfig>
</ext:Panel>
然后我们使用一个Droptarget来为我们的画布添加可以接收拖动释放的控件的功能
<ext:DropTarget ID="ddt" runat="server" Target="mainPanel" Group="tree2div" IgnoreSelf="false">
<NotifyDrop Fn="notifyDrop" />
<NotifyEnter Handler="ftConfig.isDraging=true;" />
</ext:DropTarget>
在这里注意一个地方就是在droptarget里面的group属性值为tree2div,这个值和我们前面给treepanel添加的treeviewdragdrop 的DragGroup属性值是必须一致的,不然是不能正常工作的。到目前为止我们其实仅仅解决了树的节点可以拖放,以及我们的mainpanel画布支持接受拖放过来的控件。但是我们的画布如何处理拖放过来的控件,以及每种区域控件可以接收的控件等等功能还得我们去设计和定义,具体的设计以及实现留到下一节吧。
基于Extjs的web表单设计器 第三节——控件拖放的更多相关文章
- 基于Extjs的web表单设计器 第七节——取数公式设计之取数公式的使用
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 基于Extjs的web表单设计器 第六节——界面框架设计
基于Extjs的web表单设计器 基于Extjs的web表单设计器 第一节 基于Extjs的web表单设计器 第二节——表单控件设计 基于Extjs的web表单设计器 第三节——控件拖放 基于Extj ...
- 基于Extjs的web表单设计器 第五节——数据库设计
这里列出表单设计器系列的内容,6.7.8节的内容应该在春节后才有时间出了.因为这周末就请假回老家了,准备我的结婚大事.在此提前祝大家春节快乐! 基于Extjs的web表单设计器 基于Extjs的web ...
- 基于Extjs的web表单设计器 第二节——表单控件设计
这一节介绍表单设计器的常用控件的设计. 在前面两章节的附图中我已经给出了表单控件的两大分类:区域控件.常用控件.这里对每个分类以及分类所包含的控件的作用进行一一的介绍,因为它们很重要,是表单设计器的基 ...
- 基于Extjs的web表单设计器
由于这样工作和自身的一些原因很长一段时间没有写过博客了.最近想把自己前面一段时间搞出的一个表单设计器的相关经验或者经历记录下来.分享给大家,也算是对自己前2个月的一个总结回顾吧. 首先介绍一下开发此版 ...
- 基于Extjs的web表单设计器 第一节
前面一节介绍了表单设计器的背景和最终的大概样式,本节主要介绍表单设计器的需求及功能设计. 在讲需求之前先明确几个常用的概念: 主表或者卡片表——具有多行多列的一个区域的控件块,如下图所示. 明细表—— ...
- 基于Extjs的web表单设计器 第四节——控件拖放
接着上一节介绍控件拖放的设计. 通过前面的介绍知道,我们的区域类型的容器控件有三种:Card.Table.Mixed. Card 可以支持几乎所有的常用控件,包括:文本TextField.多文本Tex ...
- YbSoftwareFactory 代码生成插件【十六】:Web 下灵活、强大的审批流程实现(含流程控制组件、流程设计器和表单设计器)
程序=数据结构+算法,而企业级的软件=数据+流程,流程往往千差万别,客户自身有时都搞不清楚,随时变化的情况更是家常便饭,抛开功能等不谈,需求变化很大程度上就是流程的变化,流程的变化会给开发工作造成很大 ...
- .net web 开发平台- 表单设计器 一(web版)
如今为了适应需求的不断变化,动态表单设计器应运而生.它主要是为了满足界面的不断变化和提高开发速度.比如:一些页面客户可能也无法确定页面的终于布局,控件的位置,在哪种情况下显示或不显示等可能须要随时改动 ...
随机推荐
- Linux嵌入式内核模块程序设计
1.环境搭建 vmware+Fedora 2.创建一个Hello文件 [root@localhost ~]# mkdir Hello 3.在Hello里面创建 hello.c 和 Makefile 两 ...
- Asp.netMVC中地址后缀使用.html,jsp等404错误解决
asp.net mvc 默认的地址路径url都是没有后缀的比如 www.a.com/aa/bb 等 如果要是www.a.com/aa/bb.html需要专门写路由. 根据我之前的经验,mvc的路由是相 ...
- python的requests模块
使用python进行接口测试得时候可以使用requests模块,是基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库 安装requests是模块 pip instal ...
- C++指针的长度
每台计算机都有字长,指明指针数据的标称大小----来自深入理解计算机系统 每台计算机的字长指明了它的虚拟空间大小.比如32位的机器,虚拟空间地址为0~2^w-1程序最多访问2^w个字节 对于32位程序 ...
- 单片机(TTL)与电脑RS232接口
2010年11月28日 21:38 1.先介绍电脑上与单片机进行通讯的接口的名称 (1)一般是用电脑串口来进行通讯的,平常大家说的电脑的串口是指台式电脑主机后面的九针接口,如下图 这个接口有个专业的 ...
- 2.ehcache.xml简介
转自:https://www.cnblogs.com/crazylqy/p/4238148.html ehcache.xml文件是用来定义Ehcache的配置信息的,更准确的来说它是定义CacheMa ...
- sql 存储过程返回值 变量名
return 语句返回值,前台调用的参数名称为 @RETURN_VALUE
- LUA 运行期间不独占线程的递归,通过回调实现
function main(d) local function func(d) moveto(d, function() print("d=======", d) d = d - ...
- 28. Implement strStr() (String)
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- for 续5
-------siwuxie095 (五)usebackq 主要用于路径或文件名有空格时的情况 (说白了,就是对 in 后面的括号内集合进行转义) 单靠看帮助文 ...