【问题标题】:How to drop something into a flex tree item?如何将某些东西放入弹性树项目中?
【发布时间】:2011-01-05 11:09:13
【问题描述】:
我刚刚在FlexExamples看到了一条评论:
关于树需要注意的一点是,它实际上只是一个显示项目的列表。这意味着,除非文件夹处于打开状态,否则您无法真正将某些东西“放入”文件夹中。即使在这种情况下,用户体验也不是很正确。因此,请尝试将所有内容移出其中一个文件夹,然后折叠该空文件夹。如果你在文件夹“上”放一些东西,它实际上会在目标文件夹和下面或上面的文件夹之间结束。当您将鼠标移到文件夹上时,会出现一条黑线来表示这一点。如果你“打开”文件夹(判断它打开的唯一方法是通过箭头)然后尝试它,你最终会得到一个额外的放置区,基本上是打开的空文件夹的下半部分。这也由黑线位置表示。
如果任何项目的中间部分总是可以作为“添加到此文件夹”的放置区域,并且顶部和底部边缘可以分别放置在上方或下方,那就更好了。
我刚刚遇到了同样的问题。有人已经解决了这个问题吗?在我的例子中,我在树中有 dragMoveEnabled 并提供了拖动树项的能力。但是不可能将一个项目拖到另一个空的项目中。您只能将拖动的项目放在空项目的上方或下方。
【问题讨论】:
标签:
apache-flex
drag-and-drop
tree
【解决方案1】:
我是这样做的:
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 更好的方法?
【解决方案2】:
我已经处理了如下问题:
- 在 dragOver 事件处理程序中:启动计时器以确定用户将项目拖到当前项目上方的时间
- 如果当前项没有子项,则添加一个标题为“将项放在此处”的新子项
- 在项目被放下(在 dragComplete 处理程序中)或用户将拖动的项目从当前项目移开(在 dragOver 处理程序中)后删除添加的子项
【解决方案3】:
这就是我现在正在做的事情:
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' />");
我必须以这种方式获取树,因为我的树是动态构建的。但无论如何,这会将一个节点添加到任何没有子节点的节点,并且只会添加一个节点。现在我只需要设置一个计时器,以便它仅在您将鼠标悬停在节点上一秒钟时才会发生。
【解决方案4】:
我的解决方法:
子类AdvancedDataGrid 并覆盖showDropFeedback。在调用 super.showDropFeedback 之前,如果您拖动的节点是一个没有子文件夹的空文件夹,请打开它。