Только перемещение с перетаскиванием в дереве Flex - PullRequest
1 голос
/ 12 сентября 2011

У меня есть дерево (во Flex 3.5), и я хочу использовать функцию перетаскивания, но я хочу позволить пользователю только перемещать узлы, а не копировать их. Я попытался прослушать событие dragOver и изменить свойство действия события перетаскивания, если оно указывает на операцию копирования, а также прослушать событие keyDown и изменить обратную связь с помощью DragManager, если нажата клавиша ctrl, но безрезультатно.

У кого-нибудь есть другая идея? Спасибо.

Ответы [ 4 ]

2 голосов
/ 09 апреля 2012

Переопределите все обработчики перетаскивания и добавьте 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);
    }

Это сделает перемещение списка только ... и не будет поддерживать копирование.

0 голосов
/ 18 октября 2013

Вы должны продлить класс.В ответе Саб Тана будут задействованы обработчики базового класса, и поэтому переопределение действия станет бесполезным.Поэтому перед вызовом обработчика базового класса нам необходимо переопределить тип действия.

0 голосов
/ 19 июня 2012

Вместо расширения класса 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;
}
0 голосов
/ 12 сентября 2011

Вы можете переопределить функции dragEnterHandler, dragOverHandler и dragDropHandler в Дереве, поскольку все они защищены и довольно просты, чтобы не отображать обратную связь по копированию и не разрешать пользователю копировать с помощью перетаскивания:

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

override protected function dragOverHandler(event:DragEvent):void
{
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...