我正在从TileList拖动到自定义组件。在接受它之前,我想知道被拖动的是什么。如何设置DragEvent中“event.dragSource.formats”使用的“格式”?
编辑以澄清: 当你在TileList上设置“dragEnabled = true”时,它会处理拖动源代码,但它使用“items”作为DragEvent的格式。我正在寻找一种让TileList使用正确格式的方法。
答案 0 :(得分:0)
我也必须处理这个问题。归结为Flex已将特定数据源“类型”硬编码到ListBase source中,因此您无法更改类型。这是好事和坏事......查看该ListBase类中的所有drag[Type]Handler
方法,看看发生了什么。
我们需要做的就是截取DragEvent.DRAG_START
事件并调用event.stopImmediatePropagation()
(幸运的是,flex会听取这个!)。这是一个示例应用程序:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application
xmlns:mx="http://www.adobe.com/2006/mxml">
<mx:Script>
<![CDATA[
import mx.events.DragEvent;
import mx.managers.DragManager;
protected function updateDragSource():void
{
selected = !selected; // flip;
sourceType = selected ? "mySource" : "items";;
}
protected function dragEnterHandler(event:DragEvent):void
{
if (!event.dragSource.hasFormat(sourceType))
event.stopImmediatePropagation();
}
]]>
</mx:Script>
<mx:Boolean id="selected"/>
<mx:String id="sourceType">items</mx:String>
<mx:TileList id="list" width="100%" height="100%" labelField="name"
dragEnabled="true" dropEnabled="true" dragMoveEnabled="true"
dragEnter="dragEnterHandler(event)">
<mx:dataProvider>
<mx:ArrayCollection>
<mx:Object name="one"/>
<mx:Object name="two"/>
<mx:Object name="three"/>
<mx:Object name="four"/>
</mx:ArrayCollection>
</mx:dataProvider>
</mx:TileList>
<mx:Label text="Change Drag Source Type:"/>
<mx:Button id="button" click="updateDragSource()" label="{sourceType}"/>
</mx:Application>
这为您提供了检查dragSource.hasFormat
是否返回true / false的基础。如果你想改变dragSource格式 的内容,你将不得不扩展TileList并覆盖拖拽方法的所有:/。 items
和orderedItems
已硬编码到ListBase中,因此您无法轻松更改格式。
您可以使用自己的格式的唯一方法是不使用任何ListBase扩展类,并实现自己的拖放系统。没那么糟糕。原因是,如果您查看ListBase中的所有拖动事件处理程序,它们会有以下内容:
var dragSource:DragSource = event.dragSource;
if (!dragSource.hasFormat("items") && !dragSource.hasFormat("orderedItems"))
return;
因此,如果它们不是那种格式,它将不允许你拖动。
希望有所帮助, 兰斯
答案 1 :(得分:-1)
formats属性是一个数组,因此您可以使用数组函数来访问它。我认为你想读更多的东西。所以你的掉落处理程序将是一个像
这样的声明如果格式是“图块列表项”,则执行删除,否则拒绝删除