我在一个Group上创建了数十个标签,我为每个标签添加了一个右键单击菜单,然后将一个事件侦听器附加到菜单上,然后我如何获得通过菜单项选择侦听器右键单击的确切标签(ContextMenuEvent.MENU_ITEM_SELECT)?非常感谢
3 回答
当我单击任何菜单项时,它的 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>
一种解决方案是创建一个自定义组件,其中包含标签和菜单皮肤部件。通过这种方式,您还可以根据需要为组件设置任何外观,并以非常简单的方式访问标签和菜单。
为了解决您的问题,我们假设皮肤部件被命名为“标签”和“菜单”。调度 ContextMenuEvent 时,您可以通过访问菜单单击处理程序中的 event.target 属性来访问单击的菜单。现在,它的父级将通过其parent属性可用,这就是您可以访问标签组件或皮肤部件的方式。所以,它会是这样的:
event.target.parent.label
在哪里:
event.target - 菜单组件
event.target.parent - 包裹标签和菜单的组件
event.target.parent.label - 你要访问的组件
总而言之,创建一个自定义组件,它包含一个标签和一个菜单,成为它的皮肤部分。这样,通过识别两个部分中的任何一个(例如在事件处理程序中),您可以通过parent属性轻松确定另一个对应的组件。
您可能需要将event.target值转换为菜单类,并将event.target.parent属性转换为您的自定义组件类,然后标签将可用。
如果您使用 Label 作为组件,则可以通过以下方式访问它:
event.contextMenuOwner.text
或者
如果您使用的是按钮,则可以通过以下方式访问它:
event.contextMenuOwner.label
希望这可能会有所帮助。