如何在列表控件上设置用于拖放的“格式”?

时间:2009-12-21 21:02:44

标签: flex flash

我正在从TileList拖动到自定义组件。在接受它之前,我想知道被拖动的是什么。如何设置DragEvent中“event.dragSource.formats”使用的“格式”?

编辑以澄清: 当你在TileList上设置“dragEnabled = true”时,它会处理拖动源代码,但它使用“items”作为DragEvent的格式。我正在寻找一种让TileList使用正确格式的方法。

2 个答案:

答案 0 :(得分:0)

嘿,这是一个很好的问题,也很复杂。由于Flex主要由Adobe开发,因此他们没有足够的能力/资源/资金来覆盖这样的边缘/定制案例。如果只是他们分散了Flex的发展!

我也必须处理这个问题。归结为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并覆盖拖拽方法的所有:/。 itemsorderedItems已硬编码到ListBase中,因此您无法轻松更改格式。

您可以使用自己的格式的唯一方法是不使用任何ListBase扩展类,并实现自己的拖放系统。没那么糟糕。原因是,如果您查看ListBase中的所有拖动事件处理程序,它们会有以下内容:

var dragSource:DragSource = event.dragSource;
if (!dragSource.hasFormat("items") && !dragSource.hasFormat("orderedItems"))
    return;

因此,如果它们不是那种格式,它将不允许你拖动。

希望有所帮助, 兰斯

答案 1 :(得分:-1)

formats属性是一个数组,因此您可以使用数组函数来访问它。我认为你想读更多的东西。所以你的掉落处理程序将是一个像

这样的声明

如果格式是“图块列表项”,则执行删除,否则拒绝删除