0

我有一个简单的 Grid 控件,其中包含一些我希望能够四处移动的按钮。下面的代码确实有效,但实际进行拖放需要付出很多努力,并且不清楚拖放会发生在哪里。我必须移动鼠标很多才能达到不拒绝丢弃的状态。我将不胜感激有关如何使其更加“用户友好”的任何建议。


<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" verticalAlign="middle" horizontalAlign="center" height="200" width="200">
    <mx:Script>
        <![CDATA[
import mx.containers.GridItem;
import mx.controls.Button;
import mx.core.DragSource;
import mx.events.*;
import mx.managers.DragManager;

private function dragInit(event:MouseEvent):void
{
    if(event.buttonDown)
    {
        var button:Button = event.currentTarget as Button;
        var dragSource:DragSource = new DragSource();
        dragSource.addData(button, 'button');
        DragManager.doDrag(button, dragSource, event);
    }
}

private function dragEnter(event:DragEvent): void
{
    var target:GridItem = event.currentTarget as GridItem;
    if (event.dragSource.hasFormat('button') && target.getChildren().length == 0)
    {
        DragManager.acceptDragDrop(target);
        DragManager.showFeedback(DragManager.MOVE);
    }
}

private function dragDrop(event:DragEvent): void
{
    var target:GridItem = event.currentTarget as GridItem;
    var button:Button = event.dragSource.dataForFormat('button') as Button;
    target.addChild(button);
}           
        ]]>
    </mx:Script>

    <mx:Grid>
        <mx:GridRow width="100%" height="100%">
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
            </mx:GridItem>
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
            </mx:GridItem>
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
                <mx:Button label="A" width="40" height="40" mouseMove="dragInit(event)"/>
            </mx:GridItem>
        </mx:GridRow>
        <mx:GridRow width="100%" height="100%">
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
            </mx:GridItem>
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
                <mx:Button label="B" width="40" height="40" mouseMove="dragInit(event)"/>
            </mx:GridItem>
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
            </mx:GridItem>
        </mx:GridRow>
        <mx:GridRow width="100%" height="100%">
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
                <mx:Button label="C" width="40" height="40" mouseMove="dragInit(event)"/>
            </mx:GridItem>
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
            </mx:GridItem>
            <mx:GridItem width="44" height="44" dragEnter="dragEnter(event)" dragDrop="dragDrop(event)">
            </mx:GridItem>
        </mx:GridRow>
    </mx:Grid>
    <mx:Style>
GridItem
{
    borderColor: #A09999;
    borderStyle: solid;
    borderThickness: 2;
    horizontal-align: center;
    vertical-align: center;
}
Grid
{
    borderColor: #A09999;
    borderStyle: solid;
    borderThickness: 2;
    horizontalGap: 0;
    verticalGap: 0;
    horizontal-align: center;
    vertical-align: center;
}
    </mx:Style>
</mx:Application>



4

4 回答 4

3

看起来每个空网格项仅存在于您定义的边界上(我不确定这是为什么,可能是容器的已知功能)。如果您为每个 GridItem 添加一个 backgroundColor,则 dragEnter 将在整个区域上触发,而不仅仅是该边框。

于 2009-02-16T11:44:21.970 回答
0

不幸的是,您必须处理所有这些事件。

于 2009-02-16T11:27:52.290 回答
0

为 Grid 组件定义背景颜色。之后,您可以将按钮放在 GridItem 的中间。

于 2009-03-24T14:06:53.730 回答
0

只需放入backgroundColor您的GridItem:)

于 2010-05-18T02:56:21.193 回答