Flex内置了用于列表控件的拖放操作,并允许您覆盖它。但他们并没有在例子中说明这一点。内置功能会自动拖动列表项,如果要覆盖它,则会发现列表本身正在设置处理程序。 我特别想做的是,我的TileList显示了我可以拖到大画布上的项目的小缩略图。当我从列表中拖动项目时,拖动代理应该是不同的图像。
所以,我遵循建议的技术,只有在代理图像上明确设置宽度/高度时它才有效。为什么?
答案 0 :(得分:3)
直到你尝试了它才明显不行。=)几周前,我在同样的事情上挣扎。这是我的解决方案:
清单:
<List>
<mouseDown>onListMouseDown(event)</mouseDown>
</Tree>
鼠标按下处理程序:
private function onMouseDown( event : MouseEvent ) : void {
var list : List = List(event.currentTarget);
// the data of the clicked row, change the name of the class to your own
var item : MyDataType = MyDataType(list.selectedItem);
var source : DragSource = new DragSource();
// MyAwsomeDragFormat is the key that you will retrieve the data by in the
// component that handles the drop
source.addData(item, "MyAwsomeDragFormat");
// this is the component that will be shown as the drag proxy image
var dragView : UIComponent = new Image();
// set the source of the image to a bigger version here
dragView.source = getABiggerImage(item);
// get hold of the renderer of the clicked row, to use as the drag initiator
var rowRenderer : UIComponent = UIComponent(list.indexToItemRenderer(list.selectedIndex));
DragManager.doDrag(
rowRenderer,
source,
event,
dragView
);
}
当用户单击列表中的项目时,将开始拖动。请注意,我没有在列表中设置dragEnabled
和其他与拖动相关的属性,因为我自己处理了所有这些属性。
将它添加到事件处理程序的开头可能很有用:
if ( event.target is ScrollThumb || event.target is Button ) {
return;
}
如果用户点击滚动条中的某个位置,则只是短路。它不是很优雅,但它可以完成这项工作。
答案 1 :(得分:1)
我找到了一个更简单的答案here。该示例扩展了DataGrid控件,但您可以对List控件执行相同操作。就我而言,我使用的是图像源而不是Class:
public class CustomDragList extends List {
[Bindable]
public var dragProxyImageSource:Object;
override protected function get dragImage():IUIComponent {
var image:Image = new Image();
image.width = 50;
image.height = 50;
image.source = dragProxyImageSource;
image.owner = this;
return image;
}
}
然后使用这样的自定义列表:
<control:CustomDragList
allowMultipleSelection="true"
dragEnabled="true"
dragProxyImageSource="{someImageSource}"
dragStart="onDragStart(event)"/>
其中'someImageSource'可以是您通常用于图像源(嵌入,链接等)的任何内容。