Как вставить что-то в элемент гибкого дерева? - PullRequest
1 голос
/ 15 января 2010

Я только что прочитал комментарий на FlexExamples :

Одна вещь, на которую следует обратить внимание в отношении дерева, это то, что на самом деле это просто список, в котором отображаются элементы. Это означает, что вы не можете что-то поместить в «папку», если папка не открыта . Даже в этом случае пользовательский опыт не совсем правильный. Поэтому попробуйте переместить все из одной из папок, а затем сверните эту пустую папку. Если вы уроните что-нибудь «на» папку, она фактически окажется между целевой папкой и папкой ниже или выше. На это указывает черная линия, появляющаяся при наведении курсора на папки. Если вы «откроете» папку (единственный способ сказать, что она открыта - стрелкой), а затем попробуете ее, вы получите дополнительную зону перетаскивания, которая в основном является нижней половиной открытой пустой папки. На это также указывает положение черных линий.

Было бы лучше, если бы средняя часть какого-либо элемента всегда была зоной добавления «добавить в эту папку», а верхний и нижний края могли быть опущены выше или ниже соответственно.

Я просто пришел к той же проблеме. Кто-нибудь уже справился с этой проблемой? В моем случае я перетащил dragMoveEnabled в дерево и предлагаю возможность перетаскивания элементов дерева. Но невозможно перетащить элемент в другой пустой элемент. Вы можете оставить только перетаскиваемый предмет над или под пустым предметом.

Ответы [ 4 ]

2 голосов
/ 19 января 2010

Я делаю это так:

protected function onDragOver(event:DragEvent):void {
    event.preventDefault();
    event.currentTarget.hideDropFeedback(event);                

    try {
        var index:int = tree.calculateDropIndex(event);
    } catch(e:Error) {
        DragManager.showFeedback(DragManager.NONE);
        return;
    }

    tree.selectedIndex = index;

    var draggedOverItem:Object = tree.selectedItem;
}

Возможно, есть даже лучший способ, чем установка selectedIndex и использование selectedItem?

1 голос
/ 18 января 2010

Это то, что я делаю сейчас:

var i:IListItemRenderer = (event.currentTarget as Tree).indexToItemRenderer((event.currentTarget as Tree).calculateDropIndex(event));
var x:XML = XML(i.data);
if (x.children().length() == 0 && x.@title != 'Drop Node Here')
   x.appendChild("<node title='Drop Node Here' />");

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

1 голос
/ 18 января 2010

Я решил проблему следующим образом:

  • В обработчике событий dragOver: запустить таймер, чтобы определить, как долго пользователь перетаскивал элемент поверх текущего элемента
  • если текущий элемент не имеет дочерних элементов, добавьте нового дочернего элемента с заголовком «Drop Item here»
  • удалить добавленного потомка после того, как элемент был удален (в обработчике dragComplete) или пользователь переместил перетаскиваемый элемент из текущего элемента (в обработчике dragOver)
0 голосов
/ 27 июня 2011

Мой обходной путь:

Подкласс AdvancedDataGrid и переопределение showDropFeedback. Перед вызовом super.showDropFeedback откройте узел, который вы перетаскиваете, если это пустая папка без дочерних элементов.

...