2011-09-12 46 views
1

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

有没有人有另一个想法? 谢谢。

回答

0

您可以覆盖dragEnterHandlerdragOverHandlerdragDropHandler功能树,因为所有的保护和相当简单,为了不显示复制的反馈,而不是允许用户通过拖动复制:

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

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

正如我所说的,我已经尝试覆盖dragOver处理程序并更改反馈,但它不起作用,反馈保持原样,即显示“+”号表示复制模式,尽管我在树和DragManager(使用移动模式)上都调用了show(Drop)Feedback功能。 – user940016

+0

对不起,实际上你需要重载一个函数 - 'dragEnterHandler'。我只是试图让它的内部变成空的 - 而且它的工作,没有DragManager的反馈,这是允许下降。 – moropus

+0

你能解释我做了什么吗?覆盖dragEnter事件对我来说不起作用... – user940016

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支持拷贝。

0

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

<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; 
} 
0

你必须扩展这个类。在Sab Than的回答中,基类处理程序将被调用,因此,覆盖该行为将变得毫无用处。所以在调用基类处理程序之前,我们需要覆盖动作类型。