Flex ::如何防止拖放,拖动到自我

时间:2009-10-19 04:16:17

标签: flex drag-and-drop

我有一个Flex问题。我想知道,如果我有两个列表框,并且我想在它们之间拖放,我该如何阻止用户拖到同一个列表上(因此复制项目?我不能有这样的情况,那就是谢谢你们。

5 个答案:

答案 0 :(得分:2)

没有测试过,但我想这样的事情应该有效:

在两个列表中收听dragStart事件,并根据source设置event.target变量。现在,请听取两个列表中的dragDrop事件,如果event.preventDefault()source相同,请致电target

答案 1 :(得分:2)

以下是我在构建一个工作应用程序时所做的一些简单的功能,我常常将头部绕着柔性拖放。我一直在寻找一种方法来拥有多个具有拖放功能的列表,这些列表不会相互干扰。另外,我不想处理复制列表数据。

private function onlyAllowMoveDragOverHandler(event:DragEvent):void {
  event.preventDefault();
  event.currentTarget.showDropFeedback(event);
  DragManager.showFeedback(DragManager.MOVE);
}

private function allowDropOnlyIfInitiatorEqualsComponent(event:DragEvent, component:IUIComponent):void {
  event.preventDefault();
  if (event.dragInitiator == component) {
    DragManager.acceptDragDrop(event.target as IUIComponent);
  }
  else {
    DragManager.showFeedback(DragManager.NONE);
  }
}

我在我的mxml中使用:

<mx:List 
    x="10" 
    y="170" 
    id="availableLangsList" 
    dataProvider="{availableLangs}" 
    width="100" 
    height="200"
    dragEnabled="true"
    dragMoveEnabled="true"
    dropEnabled="true"
    dragOver="onlyAllowMoveDragOverHandler(event);"
    dragEnter="allowDropOnlyIfInitiatorEqualsComponent(event, selectedLangsList);"
    dragComplete="selectedLangs.refresh();"
    />

  <mx:Label x="129" y="153" text="list 4"/>
  <mx:List 
    x="129" 
    y="170" 
    id="selectedLangsList" 
    dataProvider="{selectedLangs}" 
    width="100" 
    height="200"
    dragEnabled="true"
    dragMoveEnabled="true"
    dropEnabled="true"
    dragOver="onlyAllowMoveDragOverHandler(event);"
    dragEnter="allowDropOnlyIfInitiatorEqualsComponent(event, availableLangsList);"
    dragComplete="availableLangs.refresh();"
    />

答案 2 :(得分:0)

我找到了解决方案,我不确定是否适用于其他任何人。我基本上在我的两个列表中: `

    <mx:List id="srcList" dataProvider="{_source}"
    allowMultipleSelection="true"
    enabled="{enabled}"
    labelField="{labelField}"
    iconFunction="iconFunction"
    dragEnabled="true" 
    dropEnabled="true" 
    dragDrop="doDragDrop(event);"
    width="100%"
    height="100%"       
    />
</mx:VBox>
<mx:VBox paddingTop="50">
    <mx:Button label="-&gt;" enabled="{enabled}" click="add()"/>
    <mx:Button label="&lt;-" enabled="{enabled}" click="rem()"/>
</mx:VBox>
<mx:VBox width="100%" height="100%">
    <mx:Label text="{right_col_heading}" />
    <mx:List id="dstList" dataProvider="{_destination}"
        allowMultipleSelection="true"
        enabled="{enabled}"
        dragEnabled="true" 
        dropEnabled="true" 
        dragDrop="doDragDrop(event);"
        width="100%"
        height="100%"
        labelField="{labelField}"
        iconFunction="iconFunction"
        verticalAlign="center"
    />`

我基本上向两个列表添加了一个dragMoveEnabled =“true”,现在基本上没有重新添加到同一个列表中的一个项目,但只是移动顺序(这对我来说无关紧要,因为它是一个肥皂发送和后面-logic无论如何都会把它放到正确的顺序。)

答案 3 :(得分:0)

在我的情况下,我使用了HashCollection(扩展了ArrayCollection)[只是google它,你会找到组件]。数据提供者绑定到此集合。您可以使用:dataprovider.put(key,object)而不是dataprovider.addItem(object)将项添加到集合中。

“哈希”将确保集合中的唯一性。因此,即使用户拖放已存在于散列中的内容,原始值也会被新对象替换(但这并不重要,因为它是相同的值)。

然而,“密钥”必须是唯一的......否则,哈希的想法将无效。

答案 4 :(得分:0)

感谢Brice,这些功能很有帮助。

要让他们在Spark列表中工作,只需使用createDropIndicator而不是showDropFeedback更新第一个函数,然后停止传递事件。

private function onlyAllowMoveDragOverHandlerS(event:DragEvent):void {
    event.preventDefault();
    event.currentTarget.createDropIndicator();
    DragManager.showFeedback(DragManager.MOVE);
}