2008-11-13 493 views
4

所以我有一個flex數據提供者,它帶有一個xmllistcollection。我希望能夠通過拖放來重新排列樹中的樹葉和樹枝。我想將拖放區域限制爲被拖動項目的當前級別。像 如何限制樹節點從flex 3中的當前節點拖出?

 
     branch 
     branch 0 
     leaf 1 
     leaf 2 
     branch x 
     leaf a 
     leaf b 
    
所以,分支x不能被下分支0和葉一移動不能在分支0中

回答

4

好吧移動,這裏是一個非常簡單的方法來做到這一點的基礎上,this Flex Quick Starts article最後一個例子。這應該可以通過使用「正確的」放置指示符(項目之間的線)來改進,而不是在拖動時選擇鼠標下的項目。

最相關的部分是onDragOver()方法,其中我們限制可放置項目的位置。

<?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; 
      import mx.core.DragSource; 
      import mx.core.UIComponent; 
      import mx.controls.Tree; 

      private var _draggedItem:XML = null; 


      private function onDragEnter(event:DragEvent) : void 
      { 
       event.preventDefault(); 
       event.currentTarget.hideDropFeedback(event); 

       var ds:DragSource = event.dragSource; 
       var items:Array = ds.dataForFormat("treeItems") as Array; 
       if (items != null && items.length > 0 && (items[0] is XML)) 
        _draggedItem = items[0]; 

       DragManager.acceptDragDrop(UIComponent(event.currentTarget)); 
      } 

      private function onDragOver(event:DragEvent) : void 
      { 
       event.preventDefault(); 
       event.currentTarget.hideDropFeedback(event); 

       tree.selectedIndex = tree.calculateDropIndex(event); 
       var node:XML = tree.selectedItem as XML; 

       // restrict drag & drop to nodes within same parent 
       if (_draggedItem.parent() != node.parent()) 
       { 
        DragManager.showFeedback(DragManager.NONE); 
        return; 
       } 

       DragManager.showFeedback(DragManager.MOVE); 
      } 

      private function onDragDrop(event:DragEvent) : void 
      { 
       event.preventDefault(); 
       event.currentTarget.hideDropFeedback(event); 

       tree.selectedIndex = tree.calculateDropIndex(event); 
       var node:XML = tree.selectedItem as XML; 

       var addToIndex:int = node.childIndex(); 
       if ((_draggedItem.parent() == node.parent()) && (addToIndex != _draggedItem.childIndex())) 
       { 
        tree.dataDescriptor.removeChildAt(node.parent(), _draggedItem, _draggedItem.childIndex()); 
        tree.dataDescriptor.addChildAt(node.parent(), _draggedItem, addToIndex); 
       } 
      } 

      private function onDragComplete(event:DragEvent) : void 
      { 
       tree.selectedIndex = -1; 
      }  
     ]]> 
    </mx:Script>  
    <mx:XML id="treeData" xmlns=""> 
     <root> 
      <node label="Massachusetts" type="state" data="MA"> 
       <node label="Boston" type="city" > 
        <node label="Smoke House Grill" type="restaurant" /> 
        <node label="Equator" type="restaurant" /> 
        <node label="Aquataine" type="restaurant" /> 
        <node label="Grill 23" type="restaurant" /> 
       </node> 
       <node label="Provincetown" type="city" > 
        <node label="Lobster Pot" type="restaurant" /> 
        <node label="The Mews" type="restaurant" /> 
       </node> 
      </node> 
      <node label="California" type="state" data="CA"> 
       <node label="San Francisco" type="city" > 
        <node label="Frog Lane" type="restaurant" /> 
       </node> 
      </node> 
     </root> 
    </mx:XML> 
    <mx:Tree width="100%" height="100%" id="tree" 
     labelField="@label" 
     dataProvider="{treeData.node}" 
     allowMultipleSelection="false" 
     dragEnabled="true" 
     dropEnabled="true" 
     dragMoveEnabled="false" 
     dragEnter="onDragEnter(event)" 
     dragOver="onDragOver(event)" 
     dragDrop="onDragDrop(event)" 
     dragComplete="onDragComplete(event)"> 
    </mx:Tree>   
</mx:Application> 
+0

非常感謝。它效果很好。 – smartdirt 2008-11-14 03:17:51

相關問題