Как установить «формат», используемый для drag'n'drop в элементе управления списком? - PullRequest
0 голосов
/ 22 декабря 2009

Я перетаскиваю из TileList в пользовательский компонент. Я хочу знать, что тащат, прежде чем я приму это. Как установить «формат», который используется для «event.dragSource.formats» в DragEvent?

Изменить для уточнения: Когда вы устанавливаете «dragEnabled = true» в TileList, он заботится о содержимом источника перетаскивания, но использует «элементы» в качестве формата DragEvent. Я ищу способ, чтобы TileList использовал правильный формат.

Ответы [ 2 ]

0 голосов
/ 05 марта 2010

Эй, это отличный вопрос, и довольно сложный. Поскольку Flex в первую очередь разрабатывается Adobe, у них нет возможностей / ресурсов / денег для покрытия крайних случаев / подобных настроек. Если бы только они децентрализовали развитие Flex!

Мне тоже приходилось сталкиваться с этой проблемой. Это сводится к тому факту, что Flex имеет жестко запрограммированные определенные «типы» источников данных в источнике ListBase , поэтому вы не можете изменять типы. Это хорошо и плохо ... Проверьте все drag[Type]Handler методы в этом классе ListBase и посмотрите, что происходит.

Все, что нам нужно сделать, это перехватить событие DragEvent.DRAG_START и вызвать event.stopImmediatePropagation() (к счастью, flex это послушает!). Вот пример приложения:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
    xmlns:mx="http://www.adobe.com/2006/mxml">

    <mx:Script>
        <![CDATA[

            import mx.events.DragEvent;
            import mx.managers.DragManager;

            protected function updateDragSource():void
            {
                selected = !selected; // flip;
                sourceType = selected ? "mySource" : "items";;
            }

            protected function dragEnterHandler(event:DragEvent):void
            {
                if (!event.dragSource.hasFormat(sourceType))
                    event.stopImmediatePropagation();
            }

        ]]>
    </mx:Script>

    <mx:Boolean id="selected"/>
    <mx:String id="sourceType">items</mx:String>

    <mx:TileList id="list" width="100%" height="100%" labelField="name"
        dragEnabled="true" dropEnabled="true" dragMoveEnabled="true"
        dragEnter="dragEnterHandler(event)">
        <mx:dataProvider>
            <mx:ArrayCollection>
                <mx:Object name="one"/>
                <mx:Object name="two"/>
                <mx:Object name="three"/>
                <mx:Object name="four"/>
            </mx:ArrayCollection>
        </mx:dataProvider>
    </mx:TileList>

    <mx:Label text="Change Drag Source Type:"/>
    <mx:Button id="button" click="updateDragSource()" label="{sourceType}"/>
</mx:Application>

Это дает вам базу для проверки, если dragSource.hasFormat возвращает true / false. Если вы хотите изменить формат DragSource на , вам придется расширить TileList и переопределить все методов перетаскивания: /. items и orderedItems жестко запрограммированы в ListBase, поэтому вы не можете легко изменить формат.

Единственный способ использовать свои собственные форматы - не использовать какие-либо классы, расширяющие ListBase, и реализовать собственную систему перетаскивания. Это не так уж плохо. Причина в том, что, если вы посмотрите на все обработчики событий перетаскивания в ListBase, у них есть такие вещи:

var dragSource:DragSource = event.dragSource;
if (!dragSource.hasFormat("items") && !dragSource.hasFormat("orderedItems"))
    return;

Так что, если они не в этом формате, вам не удастся перетащить.

Надеюсь, это поможет, Lance

0 голосов
/ 22 декабря 2009

свойство format является массивом, поэтому для доступа к нему вы должны использовать функции массива. Я думаю, что это больше, что вы хотите прочитать. так что ваш обработчик дропа будет выглядеть как

если format является "элементом списка тайлов", тогда сделайте отбрасывание, иначе запретите опускание

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...