4
所以我有一個flex數據提供者,它帶有一個xmllistcollection。我希望能夠通過拖放來重新排列樹中的樹葉和樹枝。我想將拖放區域限制爲被拖動項目的當前級別。像 如何限制樹節點從flex 3中的當前節點拖出?
branch branch 0 leaf 1 leaf 2 branch x leaf a leaf b所以,分支x不能被下分支0和葉一移動不能在分支0中
所以我有一個flex數據提供者,它帶有一個xmllistcollection。我希望能夠通過拖放來重新排列樹中的樹葉和樹枝。我想將拖放區域限制爲被拖動項目的當前級別。像 如何限制樹節點從flex 3中的當前節點拖出?
branch branch 0 leaf 1 leaf 2 branch x leaf a leaf b所以,分支x不能被下分支0和葉一移動不能在分支0中
好吧移動,這裏是一個非常簡單的方法來做到這一點的基礎上,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>
非常感謝。它效果很好。 – smartdirt 2008-11-14 03:17:51