仅限移动和拖动放入Flex树

时间:2011-09-12 06:55:43

标签: flex

我有一棵树(在Flex 3.5中),我想使用拖动和放大器删除功能,但我想让用户只移动节点,而不是复制它们。我尝试监听dragOver事件并更改拖动事件的action属性(如果它指示复制操作),并且还监听keyDown事件并使用DragManager更改反馈如果按下的键是ctrl,但无效。

有人有另一个想法吗? 感谢。

4 个答案:

答案 0 :(得分:2)

覆盖所有拖动处理程序并添加event.action = DragManager.MOVE见下文:

    override protected function dragEnterHandler(event:DragEvent):void{
        if(event.action == DragManager.COPY)
            event.action=DragManager.MOVE;
        super.dragEnterHandler(event);
    }

    override protected function dragCompleteHandler(event:DragEvent):void{
        if(event.action == DragManager.COPY)
            event.action=DragManager.MOVE;
        super.dragCompleteHandler(event);
    }

    override protected function dragDropHandler(event:DragEvent):void{
        if(event.action == DragManager.COPY)
            event.action=DragManager.MOVE;
        super.dragDropHandler(event);
    }

    override protected function dragExitHandler(event:DragEvent):void{
        if(event.action == DragManager.COPY)
            event.action=DragManager.MOVE;
        super.dragExitHandler(event);
    }

    override protected function dragOverHandler(event:DragEvent):void{
        if(event.action == DragManager.COPY)
            event.action=DragManager.MOVE;
        super.dragOverHandler(event);
    }

    override protected function dragStartHandler(event:DragEvent):void{
        if(event.action == DragManager.COPY)
            event.action=DragManager.MOVE;
        super.dragStartHandler(event);
    }

这将使列表仅移动..并且wudnot支持复制。

答案 1 :(得分:0)

您可以覆盖树中的dragEnterHandlerdragOverHandlerdragDropHandler功能,因为所有功能都受到保护且非常简单,以便不显示副本反馈,也不允许用户通过拖动:

override protected function dragEnterHandler(event:DragEvent):void
{
    // ...
}

override protected function dragOverHandler(event:DragEvent):void
{
    // ...
}

答案 2 :(得分:0)

我们可以通过为dragOver,dragDrop添加我们自己的事件处理程序来实现与上述答案相同的逻辑,而不是扩展Tree类(不必要)。我们的事件处理程序在之前执行默认值,因此可以修改事件属性,例如action。所以一个例子就是

<mx:DataGrid id="datagrid" dragEnabled="true" dropEnabled="true" 
    dragMoveEnabled="true" dragEnter="datagrid_dragEnterHandler(event)"
    dragDrop="datagrid_dragDropHandler(event)" 
    dragOver="datagrid_dragOverHandler(event)"/>
....
protected function datagrid_dragDropHandler(event:DragEvent):void {
    event.action = DragManager.MOVE;
}
protected function datagrid_dragOverHandler(event:DragEvent):void {
    event.action = DragManager.MOVE;
}

答案 3 :(得分:0)

你必须扩展课程。在Sab Than的回答中,将调用基类处理程序,因此,覆盖该操作将变得无用。因此,在调用基类处理程序之前,我们需要覆盖操作类型。