Vorrei consentire a un utente di riordinare gli elementi all'interno di una cartella ad albero Flex, ma non spostare quegli elementi all'esterno della cartella. Posso impedire che il drop esterno abbia successo, ma vorrei dare al feedback dell'utente (prima della caduta) che il drop non avrà successo. Ho trovato molti esempi riguardanti l'azione di rilascio, ma nulla che mostri il feedback corretto all'utente.Prevenzione del feedback di caduta dell'albero flessibile
In base alla documentazione Tree, dovrei essere in grado di chiamare DragManager.showFeedback(DragManager.NONE)
durante l'evento dragOver
, ma non funziona. Di seguito è riportato un breve progetto di esempio. C'è un modo per indicare all'utente durante un evento di trascinamento che la caduta non avrà successo?
Grazie in anticipo per qualsiasi soluzione!
<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication xmlns:fx="http://ns.adobe.com/mxml/2009"
xmlns:s="library://ns.adobe.com/flex/spark"
xmlns:mx="library://ns.adobe.com/flex/mx"
width="354"
height="480">
<fx:Script>
<![CDATA[
import mx.collections.ArrayCollection;
import mx.core.IUIComponent;
import mx.core.mx_internal;
import mx.events.DragEvent;
import mx.events.FlexEvent;
import mx.managers.DragManager;
protected function tree_dragEnterHandler(event:DragEvent):void {
// only items can be dragged - not folders
if ([email protected] == "item") {
DragManager.acceptDragDrop(IUIComponent(event.currentTarget));
} else {
event.preventDefault();
DragManager.showFeedback(DragManager.NONE);
}
}
protected function tree_dragOverHandler(event:DragEvent):void {
var dropData:Object = tree.mx_internal::_dropData;
var dragItem:XML = event.dragSource.dataForFormat("treeItems")[0];
if (!dropData || !dropData.parent || !dragItem.parent() || dragItem.parent() != dropData.parent) {
trace("preventing drop");
DragManager.showFeedback(DragManager.NONE);
return;
}
trace("allowing drop");
DragManager.showFeedback(DragManager.MOVE);
}
protected function tree_dragDropHandler(event:DragEvent):void {
}
]]>
</fx:Script>
<fx:Declarations>
<fx:XML id="treeData">
<folder id="root"
label="root"
type="root">
<folder id="folder1"
label="Folder 1"
type="folder">
<folder id="folder2"
label="Folder 2"
type="folder">
<item id="item1"
label="Item 1"
type="item"/>
<item id="item2"
label="Item 2"
type="item"/>
<item id="item3"
label="Item 3"
type="item"/>
<item id="item4"
label="Item 4"
type="item"/>
<item id="item5"
label="Item 5"
type="item"/>
</folder>
</folder>
<folder id="folder3"
label="Folder 3"
type="folder"/>
<folder id="folder4"
label="Folder 4"
type="folder"/>
<folder id="folder5"
label="Folder 5"
type="folder"/>
</folder>
</fx:XML>
</fx:Declarations>
<mx:Tree id="tree"
left="29"
right="28"
top="28"
bottom="27"
dragEnabled="true"
dropEnabled="true"
dragMoveEnabled="true"
dataProvider="{treeData}"
labelField="@label"
dragEnter="tree_dragEnterHandler(event)"
dragOver="tree_dragOverHandler(event)"
dragDrop="tree_dragDropHandler(event)"
showRoot="false">
</mx:Tree>
</s:WindowedApplication>
provare a mettere tutta la tua logica in dragEnterHandler - documentazione afferma che DragEvent.DRAG_ENTER dovrebbe essere usato (non DragEvent.DRAG_OVER) –
dragEnterHandler() solo viene chiamato una volta all'inizio del trascinamento. Voglio poter modificare il feedback durante il trascinamento, in base all'elemento sotto il cursore. –
Questo sta accadendo perché mentre si imposta il feedback di trascinamento su "NONE" immediatamente dopo che il comportamento di trascinamento della struttura predefinito in Albero lo riporta su "MOVE". [Questa pagina] (http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7cfe.html) mostra due esempi di trascinamento della selezione, uno per i controlli non di elenco e uno per i controlli basati su elenchi (come l'albero). Nell'esempio basato sull'elenco, ti vengono assegnate 3 scelte: usa il comportamento incorporato, fai il rollover o usa una combinazione di entrambi. Lo stai facendo, quando imposti il feedback di trascinamento su "NONE" viene sovrascritto dal comportamento predefinito. –