2013-04-12 4 views
6

मैं किसी उपयोगकर्ता को फ्लेक्स ट्री फ़ोल्डर में वस्तुओं को पुन: व्यवस्थित करने की अनुमति देना चाहता हूं, लेकिन उन आइटम को फ़ोल्डर के बाहर नहीं ले जाना चाहता हूं। मैं बाहरी बूंद को सफल होने से रोक सकता हूं, लेकिन मैं उपयोगकर्ता प्रतिक्रिया (ड्रॉप से ​​पहले) देना चाहता हूं कि ड्रॉप सफल नहीं होगा। मुझे ड्रॉप एक्शन के बारे में कई उदाहरण मिल गए हैं, लेकिन कुछ भी नहीं जो उपयोगकर्ता को सही प्रतिक्रिया दिखाता है।फ्लेक्स पेड़ ड्रॉप फीडबैक को रोकना

ट्री प्रलेखन के अनुसार, dragOver ईवेंट के दौरान मुझे DragManager.showFeedback(DragManager.NONE) पर कॉल करने में सक्षम होना चाहिए, लेकिन यह काम नहीं कर रहा है। एक लघु नमूना परियोजना नीचे शामिल है। ड्रैग इवेंट के दौरान उपयोगकर्ता को इंगित करने का कोई तरीका है कि ड्रॉप सफल नहीं होगा?

किसी भी समाधान के लिए अग्रिम धन्यवाद!

<?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> 
+0

dragEnterHandler में अपने सभी तर्क डालने का प्रयास करें - प्रलेखन कहा गया है कि DragEvent.DRAG_ENTER इस्तेमाल किया जाना चाहिए (नहीं DragEvent.DRAG_OVER) –

+0

dragEnterHandler() केवल खींचें के शुरू में एक बार कहा जाता हो जाता है। मैं कर्सर के नीचे आइटम के आधार पर ड्रैग के दौरान प्रतिक्रिया को बदलने में सक्षम होना चाहता हूं। –

+0

ऐसा इसलिए हो रहा है क्योंकि जब आप ट्री के ड्रैग और ड्रॉप व्यवहार के निर्माण के तुरंत बाद "NONE" पर ड्रैग फीडबैक सेट करते हैं तो इसे वापस "MOVE" पर सेट किया जाता है। [यह पृष्ठ] (http://help.adobe.com/en_US/flex/using/WS2db454920e96a9e51e63e3d11c0bf69084-7cfe.html) ड्रैग और ड्रॉप के दो उदाहरण दिखाता है, एक गैर-सूची नियंत्रण के लिए, और सूची आधारित नियंत्रणों के लिए एक (जैसे पेड़)। सूची आधारित उदाहरण में, आपको 3 विकल्प दिए गए हैं: व्यवहार में निर्मित, अपना रोल करें, या दोनों के संयोजन का उपयोग करें। आप बाद वाले कर रहे हैं, जब आप ड्रैग फीडबैक को "नहीं" पर सेट करते हैं तो यह डिफ़ॉल्ट व्यवहार से ओवरराइड हो जाता है। –

उत्तर

2

ऐसा नहीं है कि डिफ़ॉल्ट खींचें और ड्रॉप कार्यक्षमता लगभग यह पूरा करने के लिए सब कुछ आवश्यक प्रदान करता है निराशा होती है, लेकिन काफी नहीं। ऐसा लगता है कि इलियाज़ का जवाब काम करना चाहिए, लेकिन यह फ्लेक्स के एमएक्स में एक बग हो सकता है: वृक्ष नियंत्रण।

मैंने अपने स्वयं के ड्रैग-एंड-ड्रॉप कार्यान्वयन को सुनीलड के रूप में कार्यान्वित करके इसे पूरा कर लिया। कोड को किसी भी व्यक्ति के लिए नीचे शामिल किया गया है जो भविष्य में एक ही समस्या में भाग सकता है।

नोट वहाँ अभी भी एक छोटे से दृश्य प्रतिक्रिया मुद्दा है जब उपयोगकर्ता maxDropIndex और maxDropIndex+1 के बीच की सीमा से अधिक खींच रहा है कि: सीमा के निचले हिस्से पर ड्रॉप सूचक संकेत मिलता है कि यह फ़ोल्डर में एक आइटम को छोड़ना संभव है परिवर्तन होगा स्तर। मैं अभी भी इसके लिए एक अच्छा समाधान ढूंढ रहा हूं (क्या कोई मुझे पेड़ स्रोत पर इंगित कर सकता है?)।

<?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.DragSource; 
      import mx.core.IUIComponent; 
      import mx.core.mx_internal; 
      import mx.events.DragEvent; 
      import mx.events.FlexEvent; 
      import mx.managers.DragManager; 

      protected var dragging:Boolean = false; 
      protected var minDropIndex:int = 0; 
      protected var maxDropIndex:int = 0; 

      protected function tree_dragEnterHandler(event:DragEvent):void { 
       // only items can be dropped 
       if (event.dragSource.hasFormat("tree_item_node")) { 
        DragManager.acceptDragDrop(IUIComponent(event.currentTarget)); 
        trace("accepting DragDrop"); 
       } else { 
        event.preventDefault(); 
        DragManager.showFeedback(DragManager.NONE); 
        trace("rejecting DragDrop"); 
       } 
      } 

      protected function tree_dragOverHandler(event:DragEvent):void { 
       var index:int = tree.calculateDropIndex(event); 
       if (index < minDropIndex || index > maxDropIndex) { 
        trace("preventing drop"); 
        DragManager.showFeedback(DragManager.NONE); 
        this.tree.hideDropFeedback(event); 
        return; 
       } 
       trace("allowing drop"); 
       DragManager.showFeedback(DragManager.MOVE); 
       this.tree.showDropFeedback(event); 
      } 

      protected function tree_dragDropHandler(event:DragEvent):void { 
       trace("dragDropHandler"); 
      } 

      protected function tree_mouseMoveHandler(event:MouseEvent):void { 
       // see if we should start a drag operation 
       if (event.buttonDown && !dragging && tree.selectedItem && [email protected] == "item") { 
        // TODO: calculate the min and max drag indices from currently-selected index 
        minDropIndex = 2; 
        maxDropIndex = 7; 

        // start the drag 
        dragging = true; 
        var dragSource:DragSource = new DragSource(); 
        dragSource.addData(tree.selectedItem, "tree_item_node"); 
        DragManager.doDrag(IUIComponent(event.currentTarget), dragSource, event); 
       } 
      } 

      protected function tree_dragCompleteHandler(event:DragEvent):void { 
       trace("dragComplete: no longer dragging"); 
       this.tree.hideDropFeedback(event); 
       dragging = false; 
      } 
     ]]> 
    </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="false" 
      dropEnabled="false" 
      dataProvider="{treeData}" 
      labelField="@label" 
      dragEnter="tree_dragEnterHandler(event)" 
      dragOver="tree_dragOverHandler(event)" 
      dragDrop="tree_dragDropHandler(event)" 
      dragComplete="tree_dragCompleteHandler(event)" 
      mouseMove="tree_mouseMoveHandler(event)" 
      showRoot="false"> 
    </mx:Tree> 
</s:WindowedApplication> 
संबंधित मुद्दे