我有一棵树(在Flex 3.5中),我想使用拖放功能,但我想让用户只移动节点,而不是复制它们。我尝试监听dragOver事件,如果它指示复制操作,则更改拖动事件的操作属性,并且如果按下的按键是ctrl,则监听keyDown事件并使用DragManager更改反馈,但无济于事。在Flex树中拖放只能移动
有没有人有另一个想法? 谢谢。
我有一棵树(在Flex 3.5中),我想使用拖放功能,但我想让用户只移动节点,而不是复制它们。我尝试监听dragOver事件,如果它指示复制操作,则更改拖动事件的操作属性,并且如果按下的按键是ctrl,则监听keyDown事件并使用DragManager更改反馈,但无济于事。在Flex树中拖放只能移动
有没有人有另一个想法? 谢谢。
您可以覆盖dragEnterHandler
,dragOverHandler
和dragDropHandler
功能树,因为所有的保护和相当简单,为了不显示复制的反馈,而不是允许用户通过拖动复制:
override protected function dragEnterHandler(event:DragEvent):void
{
// ...
}
override protected function dragOverHandler(event:DragEvent):void
{
// ...
}
超越控制所有拖动处理程序,并添加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);
}
这将使只有列表中移动..和wudnot支持拷贝。
除了扩展Tree类(不必要),我们可以通过添加我们自己的dragOver事件处理函数dragDrop来实现与上述答案相同的逻辑。我们的事件处理程序在默认的之前执行,因此可以像操作一样修改事件属性。所以一个例子是
<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的回答中,基类处理程序将被调用,因此,覆盖该行为将变得毫无用处。所以在调用基类处理程序之前,我们需要覆盖动作类型。
正如我所说的,我已经尝试覆盖dragOver处理程序并更改反馈,但它不起作用,反馈保持原样,即显示“+”号表示复制模式,尽管我在树和DragManager(使用移动模式)上都调用了show(Drop)Feedback功能。 – user940016
对不起,实际上你需要重载一个函数 - 'dragEnterHandler'。我只是试图让它的内部变成空的 - 而且它的工作,没有DragManager的反馈,这是允许下降。 – moropus
你能解释我做了什么吗?覆盖dragEnter事件对我来说不起作用... – user940016