随笔-312  评论-11907  文章-2  trackbacks-224
English Version: http://dflying.dflying.net/1/archive/77_atlas_drag__drop_overview.html
中文版:http://dflying.cnblogs.com/archive/2006/04/23/382916.html 

请同时参考:
使用ASP.NET Atlas实现拖放(Drag & Drop)效果(上)

在本篇中我将使用AtlasDragDropList Behavior配合AtlasListView控件(关于ListView,请参考:使用ASP.NET Atlas ListView控件显示列表数据)来实现一个用户可通过拖拽重新排列内容的页面。大概类似StartWindows Live的样子,或者,如果你熟悉ASP.NET中的Web Parts,也差不多。当然,这里仅仅是一个演示,不可能做出同样复杂的功能和眩目的效果。您可以在本文的最后下载到这个DEMO的源文件。

首先,一个ScriptManager是必不可少的,不要忘记在其中引入AtlasUIDragDrop脚本文件,它不是Atlas默认加载的。

<atlas:ScriptManager ID="scriptManager" runat="server">
    
<Scripts>
        
<atlas:ScriptReference ScriptName="AtlasUIDragDrop" />
    
</Scripts>
</atlas:ScriptManager>

然后,让我们在页面上添加一个静态的布局,这将是用户加载页面之后看到的初始布局,然后再考虑添加动态的Atlas标记使其能够自由拖动。这里我将创建左右两个区域,区域中的内容既可以在区域之间拖动以改变布局,也可以在本区域内拖动以改变顺序。可拖拽的部分将被包含在一个div中,内部包含任意的控件(可为ASP.NET服务器端控件)。

<!-- Left Area -->
<div id="leftArea" class="list1">
    
<div id="content1" class="item">
        
<div id="content1Title" class="itemTitle">Content 1</div>
        
<div class="itemContent">
            
<asp:Login ID="myLogin" runat="server"></asp:Login>
        
</div>
    
</div>
    
<div id="content2" class="item">
        
<div id="content2Title" class="itemTitle">Content 2</div>
        
<div class="itemContent">
            Dflying's Item
        
</div>
    
</div>
</div>
<!-- Right Area -->
<div id="rightArea" class="list2">
    
<div id="content3" class="item">
        
<div id="content3Title" class="itemTitle">Content 3</div>
        
<div class="itemContent">
            
<asp:Calendar ID="myCalendar" runat="server" CssClass="centered"></asp:Calendar>
        
</div>
    
</div>
</div>

在上面的代码中,我加入了两个区域和三个panel,声明了页面的初始样子。下面让我们加入两个模版:一个用来表示当拖动元素经过可投放区域时,可投放区域高亮的样式(dropCueTemplate)。一个用来表示当某个可投放区域为空的时候的样式(emptyTemplate)。

<!-- Hide template elements -->
<div style="display:none;">
    
<!-- DropCue Template -->
    
<div id="dropCueTemplate" class="dropCue">
    
</div>
    
<!-- Empty Template -->
    
<div id="emptyTemplate" class="emptyList">
        Drop content here.
    
</div>
</div>

恩,还有一些CSS的定义,为方便您的理解,也列在下面:

body, input {font-family:Verdana; font-size: 0.7em;}
.list1
{width: 45%; float: left}
.list2
{width: 45%; float: right}
.item
{background:#fff;}
.itemContent
{padding:5px;text-align:center;}
.itemTitle
{background:#e5ecf9;font-weight:bold;cursor:move;}
.dropCue
{border:dashed 1px #ff0000;}
.emptyList
{text-align:center;}

OK,现在可以添加Atlas标记让页面真得动起来了:)上面定义的两个投放区域将被添加DragDropList Behavior以成为Atlas控件。

<!-- Left Area -->
<control id="leftArea">
    
<behaviors>
        
<dragDropList dataType="HTML" acceptedDataTypes="'HTML'" dragMode="Move" direction="Vertical">
            
<dropCueTemplate>
                
<template layoutElement="dropCueTemplate" />
            
</dropCueTemplate>
            
<emptyTemplate>
                
<template layoutElement="emptyTemplate" />
            
</emptyTemplate>
        
</dragDropList>
    
</behaviors>
</control>

<!-- Right Area -->
<control id="rightArea">
    
<behaviors>
        
<dragDropList dataType="HTML" acceptedDataTypes="'HTML'" dragMode="Move" direction="Vertical">
            
<dropCueTemplate>
                
<template layoutElement="dropCueTemplate" />
            
</dropCueTemplate>
            
<emptyTemplate>
                
<template layoutElement="emptyTemplate" />
            
</emptyTemplate>
        
</dragDropList>
    
</behaviors>
</control>

在上面的代码中,我们将leftArea以及rightArea提升为Atlas控件,并且添加了DragDropList Behavior。这两个DragDropList包含了一些类型为HTML的内容,也将可以接受类型为HTML的内容被投放在其中(由dataType以及acceptedDataTypes属性设定)。这两个DragDropList排列内容的方向为Vertical(可以为Vertical或者Horizontal,由direction属性设定)。并且拖拽的方式为Move(可以为Move或者Copy,前者将拖动元素移动,移动后原处不再存在;后者将拖动元素拷贝,移动后原处还存在。由dragMode属性设定)。还指定了上面定义dropCueTemplateemptyTemplate两个模版。

下面来定义可拖动的元素:

<!-- Draggable items -->
<control id="content1">
    
<behaviors>
        
<draggableListItem handle="content1Title" />
    
</behaviors>
</control>
<control id="content2">
    
<behaviors>
        
<draggableListItem handle="content2Title" />
    
</behaviors>
</control>
<control id="content3">
    
<behaviors>
        
<draggableListItem handle="content3Title" />
    
</behaviors>
</control>

同样的,在上面的代码中,我们将三个panel提升为Atlas控件,并添加了DraggableListItem Behavior。这个Behavior将允许被定义的元素可以被拖动。handle属性定义了可拖动的部分(类似于Window窗口中的标题栏)。

现在我们可以测试一下了:

初始:

开始拖动左边的Calendar,您可以看到dropCueTemplate显示了出来(右面红色的虚线框)。页面的下方同时自动出现了Debugging Trace的提示,很方便调试:

Calendar拖到右面的列表中,左边只剩下了一个可拖动元素:

把左边的可拖动元素也拖到右面,您可以看到emptyTemplate

该示例程序可在此下载:http://files.cnblogs.com/dflying/AtlasDragDropDemo.zip 

posted on 2006-04-23 21:05 Dflying Chen 阅读(7036) 评论(75)  编辑 收藏 所属分类: ASP.NET AJAX (Atlas)

评论:
#1楼  2006-04-23 21:29 | web [未注册用户]
atlas 好牛阿。这么多功能!
  回复  引用    
#2楼 [楼主] 2006-04-24 08:37 | Dflying Chen      
@web
这些都是必须的阿
  回复  引用  查看    
#3楼  2006-04-24 09:20 | henry      
ASP.NET 2.0
的WebParts的控件好象有这个功能.在MSDN介绍asp.net看到过。
UI个性化还是不错的.
暂时还没有碰到客户需要这种功能。
  回复  引用  查看    
#4楼 [楼主] 2006-04-24 09:35 | Dflying Chen      
@henry
或者是客户还不知道浏览器可以做出这种功能吧。其实这功能挺有用的。
  回复  引用  查看    
#5楼  2006-04-24 11:49 | swanky      
不知道微软这套东西对跨浏览器支持怎么样啊
  回复  引用  查看    
#6楼 [楼主] 2006-04-24 12:55 | Dflying Chen      
@swanky
还可以吧
  回复  引用  查看    
#7楼  2006-04-28 17:56 | fishrimp.NET [未注册用户]
谢谢
  回复  引用    
#8楼 [楼主] 2006-04-28 18:11 | Dflying Chen      
@fishrimp.NET
hmmmm :)
  回复  引用  查看    
#9楼  2006-04-28 20:38 | fishrimp.NET [未注册用户]
请问:如果我不想显示Debugging Trace信息,该怎么设置呢?谢谢!
  回复  引用    
#10楼 [楼主] 2006-04-29 09:09 | Dflying Chen      
@fishrimp.NET
运行Release Build
  回复  引用  查看    
#11楼  2006-04-29 16:10 | fishrimp.NET [未注册用户]
@Dflying Chen
谢谢!
  回复  引用    
#12楼 [楼主] 2006-04-30 09:47 | Dflying Chen      
@fishrimp.NET
just enjoy :)
  回复  引用  查看    
#13楼  2006-05-16 10:23 | suqx520 [未注册用户]
我的怎么不能实现拖放效果呢?
我按照你上面的所说那样子写呀!
可是就是实现不了呀!

  回复  引用    
#14楼 [楼主] 2006-05-16 11:13 | Dflying Chen      
@suqx520
您有没有运行过上面的示例程序呢?有什么问题么?
  回复  引用  查看    
#15楼  2006-05-24 11:36 | nal [未注册用户]
请问如何保存拖放后的信息??
  回复  引用    
#16楼 [楼主] 2006-05-24 15:39 | Dflying Chen      
@nal
可以使用Atlas Profile Service,请参考:
http://dflying.cnblogs.com/archive/2006/04/29/388560.aspx

  回复  引用  查看    
#17楼  2006-05-28 00:44 | 三月      
太可爱了^_^
  回复  引用  查看    
#18楼 [楼主] 2006-05-28 08:26 | Dflying Chen      
@三月
哪里可爱了?
  回复  引用  查看    
#19楼  2006-06-05 15:45 | 一帆(老鼠粮仓之路)      
运行你的demo正常
一点小问题。拖下content2以后再把鼠标放上去,鼠标不边为那个拖动的形状了,必须把鼠标放到content2文字上才出现,而其他正常
但是自己做了个既然怪事:
我只用一个<!-- Left Area -->
里面有两个div,点任何一个鼠标都不边,可以拖动,但是当你一把鼠标放上去,上面的和下面的就互相交换位置了啊
怪事
  回复  引用  查看    
#20楼  2006-06-05 15:50 | 一帆(老鼠粮仓之路)      
对了,可能是那个也将可以接受类型为HTML的内容被投放在其中(由dataType以及acceptedDataTypes属性设定)没有搞对,因为里面有js代码
应该怎么设置?
谢谢
  回复  引用  查看    
#21楼 [楼主] 2006-06-05 16:43 | Dflying Chen      
@一帆(老鼠粮仓之路)
没懂你的意思,贴段代码来
  回复  引用  查看    
#22楼  2006-06-05 16:45 | 一帆(老鼠粮仓之路)      
呵呵
no drag source found!!!
  回复  引用  查看    
#23楼  2006-06-05 16:46 | 一帆(老鼠粮仓之路)      
如果你有QQ那多好啊
交流就很详细了
但是你没有
有朋友为你搞了个QQ群:22612834

  回复  引用  查看    
#24楼 [楼主] 2006-06-05 17:30 | Dflying Chen      
@一帆(老鼠粮仓之路)
Source呢?
  回复  引用  查看    
#25楼 [楼主] 2006-06-05 17:32 | Dflying Chen      
@一帆(老鼠粮仓之路)
没太多时间上QQ阿
  回复  引用  查看    
#26楼  2006-06-06 14:26 | 一帆(老鼠粮仓之路)      
没搞了,所有的拖动代码去掉了,加上后莫名其妙的问题
以后有机会上QQ或者MSN的时候再交流请教吧
  回复  引用  查看    
#27楼 [楼主] 2006-06-08 11:17 | Dflying Chen      
@一帆(老鼠粮仓之路)
不会吧??
  回复  引用  查看    
#28楼  2006-06-26 20:11 | 阿不      
看过一个老外类似的代码,不过像上面的朋友提的问题一下,如何才能像WebPart那样拖放过的效果,到目前为止还没有一个很好的想法。
  回复  引用  查看    
#29楼  2006-06-29 09:42 | ston [未注册用户]
thanks
  回复  引用    
#30楼  2006-07-04 11:37 | San [未注册用户]
大家用的VS.Net2005是什么版本的呀?为什么我的Configuration Manager中没有Release。郁闷了,不能发布Release版本,有没有什么配置方法啊?
  回复  引用    
#31楼 [楼主] 2006-07-04 16:22 | Dflying Chen      
@阿不
什么拖放过的效果?
  回复  引用  查看    
#32楼 [楼主] 2006-07-04 16:23 | Dflying Chen      
@San
不会吧?新建一个Solution也没有么?
  回复  引用  查看    
#33楼 [楼主] 2006-07-04 16:23 | Dflying Chen      
@ston
:)
  回复  引用  查看    
#34楼  2006-07-24 12:00 | CrazyLie [未注册用户]
@Dflying Chen
这东东不能通过javascript动态添加模块(模块为另一页面)啊
我试了很多方法都不行, 不知你有没有成功的例子?
  回复  引用    
#35楼  2006-07-27 16:35 | swx3000 [未注册用户]
@fishrimp.NET
<configuration>
<system.web>
<compilation debug="true">
<!-- etc. -->
</compilation>
</system.web>
<configuration>
把true改false就没Debugging Trace了

  回复  引用    
#36楼  2006-07-31 16:26 | aspnetx      
正好可以在我的网站转换中借鉴一下
因为我在一个政府部门的网站中想用这个效果呵呵
而他们不会考虑到什么内容的导入,够绚就行
  回复  引用  查看    
#37楼 [楼主] 2006-08-05 08:56 | Dflying Chen      
@CrazyLie
模块为什么意思呢?
  回复  引用  查看    
#38楼 [楼主] 2006-08-05 08:57 | Dflying Chen      
@swx3000
thanks
  回复  引用  查看    
#39楼 [楼主] 2006-08-05 08:59 | Dflying Chen      
@aspnetx
呵呵,需求有不同啊
  回复  引用  查看    
#40楼  2006-08-22 11:17 | 太子      
拖拽后如何保存呢!

下次加载页面怎么能让其还原到最终拖拽的样子啊!

请教各位!小弟先谢了啊!
  回复  引用  查看    
#41楼  2006-08-23 15:06 | 新手问路 [未注册用户]
我想问问怎么示例下载后怎么会打不开呢
还有啊 有谁可以帮助我吗 我对这个atlas很感兴趣 有谁可以帮助我吗
再这里将不胜感激 让我做什么都愿意 ^_^
加我qq:83837120
希望大家一起来帮助我啊

  回复  引用    
#42楼  2006-08-23 17:54 | 新手问路 [未注册用户]
怎么这个示例下了文件打不开(格式:请作者看看啊,应该有问题),而且这个托放的功能具体实现是怎么做的呢 具体步骤写得不详细啊!!!一个新手问题
  回复  引用    
#43楼 [楼主] 2006-08-26 13:41 | Dflying Chen      
@CrazyLie
我没有懂您的意思
  回复  引用  查看    
#44楼 [楼主] 2006-08-26 13:42 | Dflying Chen      
@太子
使用Profile控件
  回复  引用  查看    
#45楼 [楼主] 2006-08-26 13:43 | Dflying Chen      
@新手问路
我看了一下,下载文件没有问题啊。看看代码就知道了
  回复  引用  查看    
#46楼  2006-09-05 18:14 | beitabeita [未注册用户]
问一下,能否动态生成dragable control里的内容
现在里面的能拖动的都是固定好的几个

假如我要新加一个div 然后也让他有拖动的功能,那该怎么实现呢?
想了好久了
不知道怎么办
国外很多网站都是可以自如的增加这种可拖动的控间的
不知道atlas里面能不能加,应该是可以的 但是这方面资料太少了
请指点一二....
  回复  引用    
#47楼  2006-09-18 16:18 | CSP [未注册用户]
请教: 如何拖动A 到容器 B 中, 然后在B中显示出A容器中的labe或text的值?

看到过get_data(dragmode, type, data), 只是, data 数据不知道如何用。


  回复  引用    
#48楼 [楼主] 2006-09-18 19:09 | Dflying Chen      
@beitabeita
动态添加控件之后要添加相应的拖动Behavior,有空我会专门介绍的。
  回复  引用  查看    
#49楼 [楼主] 2006-09-18 19:10 | Dflying Chen      
@CSP
没懂您的意思?
  回复  引用  查看    
#50楼  2006-09-19 11:37 | CSP [未注册用户]
Type.registerNamespace('Custom.UI');

Custom.UI.DropZoneBehavior = function() {
Custom.UI.DropZoneBehavior.initializeBase(this);

this.initialize = function() {
Custom.UI.DropZoneBehavior.callBaseMethod(this, 'initialize');
// Register ourselves as a drop target.
Sys.UI.DragDropManager.registerDropTarget(this);
}
this.dispose = function() {
Custom.UI.DropZoneBehavior.callBaseMethod(this, 'dispose');
}
this.getDescriptor = function() {
var td = Custom.UI.DropZoneBehavior.callBaseMethod(this, 'getDescriptor');
return td;
}

// IDropTarget members.
this.get_dropTargetElement = function() {
return this.control.element;
}
this.drop = function(dragMode, type, data) {
alert('dropped');
}
this.canDrop = function(dragMode, dataType) {
return true;
}
this.onDragEnterTarget = function(dragMode, type, data) {
}
this.onDragLeaveTarget = function(dragMode, type, data) {
}
this.onDragInTarget = function(dragMode, type, data) {
}
}
Custom.UI.DropZoneBehavior.registerClass('Custom.UI.DropZoneBehavior', Sys.UI.Behavior, Sys.UI.IDragSource, Sys.UI.IDropTarget, Sys.IDisposable);
Sys.TypeDescriptor.addType('script', 'DropZoneBehavior', Custom.UI.DropZoneBehavior);



我自己想写 override drop(dragMode, type, data) 可是 接受不到 data值。


目的就是想知道,谁 ‘空降’在我的头上了


  回复  引用    
#51楼  2006-09-19 11:42 | CSP [未注册用户]
如果有server端的dragdrop例子,9更好了。
就是想知道,谁 ‘空降’在我的头上了。

目的是为了,操作‘drop’下来的数据。
  回复  引用    
#52楼  2006-11-01 15:45 | xaoxong [未注册用户]
您好..
能不能把例子更新成Ajax Beta1版的?期待Ing.........
  回复  引用    
#53楼  2006-11-01 18:34 | Cat Chen      
@CSP
你那段代码有些问题哦:
Custom.UI.DropZoneBehavior = function() {
Custom.UI.DropZoneBehavior.initializeBase(this);
//...
}
这样写是不行的,构造函数必须有一个参数element,然后initializeBase(this, [element])。你自己参考一下其它Behavior是如何继承的吧,它们都是那样写的。

另外,自己去实现IDragSource和IDropTarget的工程量是巨大的,你自己看一下DragDropList的代码就知道了。IDragSouce和IDropTarget是接口,而且不是标记接口,不是你实现了它们就能自动为你的element绑定有关鼠标操作,你还是需要自己来绑定有关鼠标操作并定义什么操作算drag什么操作算drop的。
  回复  引用  查看    
#54楼 [楼主] 2006-11-02 00:05 | Dflying Chen      
@Cat Chen
恩,确实如此,而且现在的Beta 1变化那么大……
  回复  引用  查看    
#55楼 [楼主] 2006-11-02 00:05 | Dflying Chen      
@xaoxong
有空的时候我一定会更新的,不过可能要等一段时间……实在抱歉……
  回复  引用  查看    
#56楼 [楼主] 2006-11-02 00:06 | Dflying Chen      
@CSP
Server端可以使用WebPart啊,对不对?
  回复  引用  查看    
#57楼  2006-11-07 00:59 | 小鱼[匿名] [未注册用户]
我也需要一个Ajax Beta1版的拖动的例子.
迫切希望Dflying Chen能早点有时间.
因为我比较着急用..先谢谢了.
  回复  引用    
#58楼 [楼主] 2006-11-07 09:03 | Dflying Chen      
@小鱼[匿名]
我会争取在本周之内发出一篇的
  回复  引用  查看    
#59楼  2006-11-22 13:59 | feifei[匿名] [未注册用户]
为什么我机子上不能运行

<atlas:ScriptManager ID="scriptManager" runat="server">
<SCRIPT>
<atlas:ScriptReference ScriptName="AtlasUIDragDrop" />
</SCRIPT>
</atlas:ScriptManager>

说没有这东东,是不是还有什么地方要配制呀
  回复  引用    
#60楼 [楼主] 2006-11-22 19:15 | Dflying Chen      
&