Chciałbym umożliwić użytkownikowi zmianę kolejności elementów w folderze drzewa Flex, ale nie przenosić tych elementów poza folder. Mogę zapobiec powodzeniu z zewnatrz, ale chciałbym dać informację zwrotną od użytkownika (przed zrzutem), że upuszczenie się nie powiedzie. Znalazłem wiele przykładów dotyczących akcji upuszczania, ale nic, co pokazuje poprawną informację zwrotną dla użytkownika.Zapobieganie zgłaszaniu upuszczania drzewa Flex
Zgodnie z dokumentacją drzewa, powinienem zadzwonić pod numer DragManager.showFeedback(DragManager.NONE)
podczas imprezy , ale to nie działa. Krótki przykładowy projekt znajduje się poniżej. Czy istnieje sposób wskazania użytkownikowi podczas zdarzenia przeciągania, że zrzut się nie powiedzie?
Z góry dziękuję za rozwiązanie!
<?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>
Spróbuj umieścić całą swoją logikę w dragEnterHandler - dokumentacja wskazuje, że DragEvent.DRAG_ENTER powinny być stosowane (nie DragEvent.DRAG_OVER) –
dragEnterHandler() jest wywoływana tylko raz na początku ulicy. Chcę mieć możliwość zmiany sprzężenia zwrotnego podczas przeciągania, w oparciu o element pod kursorem. –
Dzieje się tak, ponieważ podczas ustawiania sprzężenia zwrotnego przeciągania na "BRAK" natychmiast po utworzeniu przeciągnij i upuść zachowanie drzewa ustawia go z powrotem na "PRZESUŃ". [Ta strona] (http://help.adobe.com/pl/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7cfe.html) pokazuje dwa przykłady przeciągania i upuszczania, jeden dla elementów sterujących bez listy i jeden dla elementów sterujących opartych na listach (np. drzewo). W przykładzie opartym na liście masz do wyboru 3 opcje: użyj wbudowanego zachowania, wykonaj własne lub użyj kombinacji obu. Robisz to drugie, po ustawieniu sprzężenia zwrotnego przeciągania na "NONE" zostanie on przesłonięty przez domyślne zachowanie. –