首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >弹性-防止某些物品被拖走

弹性-防止某些物品被拖走
EN

Stack Overflow用户
提问于 2010-03-22 16:19:55
回答 3查看 4.3K关注 0票数 2

如何防止为拖动列表或DataGrid中的某些项?

假设我有一个清单,上面有两个项目:“汤姆”和“曾傑瑞”。只有“汤姆”应该是可拖的,而不是“曾傑瑞”。

理想情况下,我有一个'isDragEnabled(item:Object):Boolean‘函数,它是由拖动源查询的。

我的困难开始于'dragStart‘事件处理程序对于dragSource有一个空值,所以从一开始我就发现很难找到拖放启动是关于什么的。

提前感谢!

PS有一些关于防止或取消一个下降的讨论,但我没有看到多少关于防止拖曳开始,因此这个问题。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-03-23 09:08:33

好的,明白了,谢谢罗布斯托,你的提示#2是灵感,但是我不得不使用鼠标向下的监听器--选择事件太晚了。

在下面的示例中,我使用了来自我的some other question的代码。

此示例仅允许拖动列表或DataGrid中的第一项:

代码语言:javascript
运行
复制
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="horizontal" minWidth="955" minHeight="600">

    <mx:List id="list" dataProvider="{['Tom','Jerry', 'Amy', 'Betty', 'Chris', 'Dean', 'Email', 'Floyd', 'Grant', 'Helen', 'Iris', 'Jack']}" minWidth="200"
        mouseDown="onMouseDown(event)"
        />

    <mx:DataGrid id="dg" dataProvider="{[{title:'Tom'},{title:'Jerry'}]}" minWidth="200"
         mouseDown="onMouseDown(event)" 
    >
        <mx:columns>
            <mx:DataGridColumn dataField="title" />
        </mx:columns>
    </mx:DataGrid>

    <mx:Script>
        <![CDATA[
            import mx.controls.listClasses.ListBase;
            import mx.events.DragEvent;


            protected function onMouseDown(event:MouseEvent):void
            {
                var listBaseComp:ListBase = ListBase(event.currentTarget);
                var clickIndex:int = this.findClickedItemIndex(event.stageX, event.stageY, listBaseComp);
                listBaseComp.dragEnabled = clickIndex == 0;
            }

            /**
             * Returns a dataProvider item that displays at the given coords for the given dataGrid.
             * Code provided by Stackoverflow user https://stackoverflow.com/users/165297/amarghosh,
             * thanks a lot!
             */
            protected function findClickedItemIndex(globalX:Number, globalY:Number, listComp:ListBase):int
            {
                var p1 : Point;
                var p2 : Point;
                var renderer : DisplayObject;

                for(var i:int=0; i<listComp.dataProvider.length; i++) {
                    renderer = DisplayObject(listComp.indexToItemRenderer(i));
                    if (!renderer) //item is not displayed (scroll to view it)
                        continue;
                    p1 = new Point(renderer.x, renderer.y);
                    p2 = new Point(renderer.width, renderer.height);
                    p1 = renderer.parent.localToGlobal(p1);
                    p2 = renderer.localToGlobal(p2);
                    if(globalX >= p1.x && globalX <= p2.x && globalY >= p1.y && globalY <= p2.y)
                        return i;
                }   
                return -1;
            }

        ]]>
    </mx:Script>
</mx:Application>
票数 1
EN

Stack Overflow用户

发布于 2011-09-22 15:53:25

如果您想要的是避免拖动项目,则应该使用如下所示:

代码语言:javascript
运行
复制
<fx:Script>
    <![CDATA[
       private function onDragStart(event:DragEvent):void {
       var selectedNode:Object = itemsList.selectedItem;
       if (selectedNode is not a draggable item) {
           event.stopImmediatePropagation();
       }
    }
    ]]>
</fx:Script>

<s:List id="itemsList" dragStart="onDragStart(event)"/>

当拖动开始时,DragStart事件就会被分派出去,所以如果您停止了事件的传播,那么就避免了项目被拖放。

票数 3
EN

Stack Overflow用户

发布于 2010-03-22 16:57:24

你可以做两件事:

  1. 您可以根据选择的items的数据对象上的属性禁用列表中不可拖动的项。这将导致它们出现视觉禁用,而您可能不想这样做,因此您也可以尝试.
  2. ,当选择有效项(基于选择的items的数据对象)时,您可以将列表的dragEnabled属性设置为"true“,当项无效时,可以将其设置为"false”。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2493878

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档