【发布时间】:2011-09-12 06:55:42
【问题描述】:
我有一棵树(在 Flex 3.5 中),我想使用拖放功能,但我想让用户只移动节点,而不是复制它们。我尝试监听 dragOver 事件并更改拖动事件的 action 属性,如果它指示复制操作,还监听 keyDown 事件并在按下的键是 ctrl 时使用 DragManager 更改反馈,但无济于事。
有人有其他想法吗? 谢谢。
【问题讨论】:
标签: apache-flex
我有一棵树(在 Flex 3.5 中),我想使用拖放功能,但我想让用户只移动节点,而不是复制它们。我尝试监听 dragOver 事件并更改拖动事件的 action 属性,如果它指示复制操作,还监听 keyDown 事件并在按下的键是 ctrl 时使用 DragManager 更改反馈,但无济于事。
有人有其他想法吗? 谢谢。
【问题讨论】:
标签: apache-flex
覆盖所有拖动处理程序并添加 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);
}
这将使列表仅移动..并且不支持复制。
【讨论】:
您可以在 Tree 中覆盖 dragEnterHandler、dragOverHandler 和 dragDropHandler 函数,因为它们都受到保护且非常简单,以便不显示复制反馈并且不允许用户通过拖动复制:
override protected function dragEnterHandler(event:DragEvent):void
{
// ...
}
override protected function dragOverHandler(event:DragEvent):void
{
// ...
}
【讨论】:
dragEnterHandler。我刚刚尝试将其内部保持为空 - 它工作正常,没有 DragManager 的反馈,允许丢弃。
我们可以通过添加我们自己的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;
}
【讨论】:
你必须扩展类。在 Sab Than 的回答中,将调用基类处理程序,因此覆盖该操作将变得无用。所以在调用基类处理程序之前,我们需要覆盖操作类型。
【讨论】: