基于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版)
如今为了适应需求的不断变化,动态表单设计器应运而生.它主要是为了满足界面的不断变化和提高开发速度.比如:一些页面客户可能也无法确定页面的终于布局,控件的位置,在哪种情况下显示或不显示等可能须要随时改动 ...
随机推荐
- PHP实现连接设备、通讯和发送命令的方法
这篇文章主要介绍了PHP实现连接设备.通讯和发送命令的方法,涉及php基于socket实现设备连接及数据通信的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下 本文实例讲述了PHP实现连接设备 ...
- MySql-5.7.17 -winx64的安装配置
一.下载软件 1. 进入mysql官网,登陆自己的Oracle账号(没有账号的自己注册一个),下载Mysql-5.7.17,下载地址:http://dev.mysql.com/downloads/my ...
- Windows常用内容渗透命令
假设现在已经拥有一台内网[域]机器,取名X-007. 1-1.内网[域]信息收集 A.本机X-007信息收集. [+]------用户列表[Windows用户列表/邮件用户/...] ----> ...
- WebStorm live edit 浏览器实现同步实现步骤
1.打开WebStore的设置对话框,找到live edit选项,选中Enable live editing. 2.打开Chrome浏览器,进入Chrome网上商店,搜索JetBrains IDE S ...
- zoj-3410-Layton's Escape
/* ZOJ Problem Set - 3410Layton's Escape ----------------------------------------------------------- ...
- 整体读入cmd结果,而不是分行读入,效率极高
public static long GetDirectorySize(string path) { long res = 0; System.Diagnostics.Process p = new ...
- iOS开发系列-ARC浅解
一.什么是 ARC ? 所谓ARC就是Automatic Reference Counting , 即自动引用计数.ARC是自iOS5引入的.ARC机制的引入是为了简化开发过程的内存管理的.相对于之前 ...
- spring data jpa、 hibernate、 jpa 三者之间的关系
http://www.cnblogs.com/xiaoheike/p/5150553.html JPA规范与ORM框架之间的关系是怎样的呢? JPA规范本质上就是一种ORM规范,注意不是ORM框架-- ...
- Remove “Quick Access” entry in Eclipse Juno
Here is a quick hack which doesn't require any plugin installation, instead you just need to add a f ...
- 让 IE6支持max-height
min-height min-height:100px; _height:100px max-height max-height:200px; overflow:auto;/*超出部分显示滚动条*/ ...