【问题标题】:Move-only with drag & drop in a Flex tree在 Flex 树中拖放只能移动
【发布时间】:2011-09-12 06:55:42
【问题描述】:

我有一棵树(在 Flex 3.5 中),我想使用拖放功能,但我想让用户只移动节点,而不是复制它们。我尝试监听 dragOver 事件并更改拖动事件的 action 属性,如果它指示复制操作,还监听 keyDown 事件并在按下的键是 ctrl 时使用 DragManager 更改反馈,但无济于事。

有人有其他想法吗? 谢谢。

【问题讨论】:

    标签: apache-flex


    【解决方案1】:

    覆盖所有拖动处理程序并添加 event.action = DragManager.MOVE 见下文:

        override protected function dragEnterHandler(event:DragEvent):void{
            if(event.action == DragManager.COPY)
                event.action=DragManager.MOVE;
            super.dragEnterHandler(event);
        }
    
        override protected function dragCompleteHandler(event:DragEvent):void{
            if(event.action == DragManager.COPY)
                event.action=DragManager.MOVE;
            super.dragCompleteHandler(event);
        }
    
        override protected function dragDropHandler(event:DragEvent):void{
            if(event.action == DragManager.COPY)
                event.action=DragManager.MOVE;
            super.dragDropHandler(event);
        }
    
        override protected function dragExitHandler(event:DragEvent):void{
            if(event.action == DragManager.COPY)
                event.action=DragManager.MOVE;
            super.dragExitHandler(event);
        }
    
        override protected function dragOverHandler(event:DragEvent):void{
            if(event.action == DragManager.COPY)
                event.action=DragManager.MOVE;
            super.dragOverHandler(event);
        }
    
        override protected function dragStartHandler(event:DragEvent):void{
            if(event.action == DragManager.COPY)
                event.action=DragManager.MOVE;
            super.dragStartHandler(event);
        }
    

    这将使列表仅移动..并且不支持复制。

    【讨论】:

      【解决方案2】:

      您可以在 Tree 中覆盖 dragEnterHandlerdragOverHandlerdragDropHandler 函数,因为它们都受到保护且非常简单,以便不显示复制反馈并且不允许用户通过拖动复制:

      override protected function dragEnterHandler(event:DragEvent):void
      {
          // ...
      }
      
      override protected function dragOverHandler(event:DragEvent):void
      {
          // ...
      }
      

      【讨论】:

      • 正如我所说,我已经尝试覆盖 dragOver 处理程序并更改反馈,但它不起作用,反馈保持原样,即显示“+”符号表示复制模式,尽管我在树和 DragManager 上都调用了 show(Drop)Feedback 函数(使用移动模式)。
      • 对不起,实际上你需要重写一个函数 - dragEnterHandler。我刚刚尝试将其内部保持为空 - 它工作正常,没有 DragManager 的反馈,允许丢弃。
      • 你能解释一下你做了什么吗?覆盖 dragEnter 事件对我也不起作用...
      • 我在派生类中所做的唯一事情是用空实现覆盖两个函数。查看更新的答案。
      • 有没有办法在不使用派生类的情况下做到这一点?我确定您使用事件侦听器来实现效果。恐怕重写处理程序可能会产生意想不到的影响......
      【解决方案3】:

      我们可以通过添加我们自己的dragOver、dragDrop 事件处理程序来实现与上述答案相同的逻辑,而不是扩展Tree 类。我们的事件处理程序默认处理程序之前执行,因此可以修改事件属性,如操作。所以一个例子是

      <mx:DataGrid id="datagrid" dragEnabled="true" dropEnabled="true" 
          dragMoveEnabled="true" dragEnter="datagrid_dragEnterHandler(event)"
          dragDrop="datagrid_dragDropHandler(event)" 
          dragOver="datagrid_dragOverHandler(event)"/>
      ....
      protected function datagrid_dragDropHandler(event:DragEvent):void {
          event.action = DragManager.MOVE;
      }
      protected function datagrid_dragOverHandler(event:DragEvent):void {
          event.action = DragManager.MOVE;
      }
      

      【讨论】:

        【解决方案4】:

        你必须扩展类。在 Sab Than 的回答中,将调用基类处理程序,因此覆盖该操作将变得无用。所以在调用基类处理程序之前,我们需要覆盖操作类型。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-24
          • 1970-01-01
          • 2011-08-05
          • 2010-11-24
          • 2011-08-13
          • 1970-01-01
          • 2011-09-19
          • 1970-01-01
          相关资源
          最近更新 更多