0

我在一个Group上创建了数十个标签,我为每个标签添加了一个右键单击菜单,然后将一个事件侦听器附加到菜单上,然后我如何获得通过菜单项选择侦听器右键单击的确切标签(ContextMenuEvent.MENU_ITEM_SELECT)?非常感谢

4

3 回答 3

0

当我单击任何菜单项时,它的 mouseTarget 属性将包含与它的父项相邻的信息。

// Handler when customized menu items are selected.       
private function menuItemHandler(event:ContextMenuEvent):void {
        var obj:InteractiveObject = event.mouseTarget;
        if(obj is Label)
             Alert.show(Label(obj).id);
}

检查这是否对您有帮助。

小应用程序。

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600"
               creationComplete="init()">

    <s:layout>
        <s:BasicLayout/>
    </s:layout>
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            import mx.controls.Alert;

            [Bindable]
            private var cm:ContextMenu;
            private var cmi:ContextMenuItem;

            private var item1:ContextMenuItem;
            private var item2:ContextMenuItem;
            private var item3:ContextMenuItem;
            private var item4:ContextMenuItem;
            private var item5:ContextMenuItem;

            private function init():void
            {
                cmi = new ContextMenuItem("Some Context Item");
                cmi.enabled = false;

                item1 = new ContextMenuItem("Customized item", true);
                item2 = new ContextMenuItem("Enable/Disable customized menu entry", true);
                item3 = new ContextMenuItem("Visible/Invisible customized menu entry");
                item4 = new ContextMenuItem("Copy\u00A0");
                item5 = new ContextMenuItem("More Flex tutorials", true);

                // Manage clicks on your customized items
                item1.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
                item2.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
                item3.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
                item4.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);
                item5.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, menuItemHandler);

                cm = new ContextMenu();
                cm.hideBuiltInItems();
                cm.customItems = [cmi, item1, item2, item3, item4, item5];
                cm.addEventListener(ContextMenuEvent.MENU_SELECT, onMnuSelect);
            }

            private function onMnuSelect(event:ContextMenuEvent):void
            {
                /* var obj:InteractiveObject = event.mouseTarget;
                if(obj is Label)
                    Alert.show(Label(obj).id); */
            }

            // Handler when customized menu items are selected.       
            private function menuItemHandler(event:ContextMenuEvent):void {
                var obj:InteractiveObject = event.mouseTarget;
                if(obj is Label)
                    Alert.show(Label(obj).id);
            }
        ]]>
    </fx:Script>

    <s:VGroup>
        <s:Label id="label1" text="label1" contextMenu="{cm}"/>
        <s:Label id="label2" text="label2" contextMenu="{cm}"/>
        <s:Label id="label3" text="label3" contextMenu="{cm}"/>
        <s:Label id="label4" text="label4" contextMenu="{cm}"/>
    </s:VGroup>


</s:Application>
于 2012-05-15T11:36:42.743 回答
0

一种解决方案是创建一个自定义组件,其中包含标签和菜单皮肤部件。通过这种方式,您还可以根据需要为组件设置任何外观,并以非常简单的方式访问标签和菜单。

为了解决您的问题,我们假设皮肤部件被命名为“标签”和“菜单”。调度 ContextMenuEvent 时,您可以通过访问菜单单击处理程序中的 event.target 属性来访问单击的菜单。现在,它的父级将通过其parent属性可用,这就是您可以访问标签组件或皮肤部件的方式。所以,它会是这样的:

event.target.parent.label

在哪里:

event.target - 菜单组件

event.target.parent - 包裹标签和菜单的组件

event.target.parent.label - 你要访问的组件

总而言之,创建一个自定义组件,它包含一个标签和一个菜单,成为它的皮肤部分。这样,通过识别两个部分中的任何一个(例如在事件处理程序中),您可以通过parent属性轻松确定另一个对应的组件。

您可能需要将event.target值转换为菜单类,并将event.target.parent属性转换为您的自定义组件类,然后标签将可用。

于 2012-05-15T09:12:29.080 回答
0

如果您使用 Label 作为组件,则可以通过以下方式访问它:

event.contextMenuOwner.text 

或者

如果您使用的是按钮,则可以通过以下方式访问它:

event.contextMenuOwner.label

希望这可能会有所帮助。

于 2012-05-15T09:40:05.707 回答