2011-09-12 125 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的回答中,基類處理程序將被調用,因此,覆蓋該行爲將變得毫無用處。所以在調用基類處理程序之前,我們需要覆蓋動作類型。