代码之家  ›  专栏  ›  技术社区  ›  Gabriel

在AS3中启用可选的自定义上下文菜单

  •  0
  • Gabriel  · 技术社区  · 16 年前

    我在AS3中有一个标签,我希望它是可选择的(.selectable=true),我希望剪贴板菜单与自定义菜单项一起在右键单击时显示。

    如果我这样做:

    var label:Label = new Label();
    label.text = "test";
    label.selectable = false;
    
    var contextMenu = new ContextMenu();
    contextMenu.clipboardMenu = true;
    contextMenu.clipboardItems.copy = true;
    contextMenu.clipboardItems.selectAll = true;
    contextMenu.addItem(new ContextMenuItem("Test Item"));
    contextMenu.addItem(new ContextMenuItem("Test Item 2"));
    
    label.contextMenu = contextMenu;
    
    thing.addChild(label);
    

    这几乎是可行的-当我右键单击标签时,我得到一个菜单,其中包含剪贴板项和自定义项…但是,由于.selectable=false,标签中的文本不可选。这将使剪贴板菜单项无效。

    如果我改线:

    label.selectable = false;
    

    到:

    label.selectable = true;
    

    标签是可选择的-但是只有剪贴板菜单项存在。

    如何使标签可选,并使用自定义项+标准剪贴板项创建菜单?

    谢谢你的帮助。

    btw-这是一个使用3.2 SDK的air应用程序。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Hrundik    16 年前

    尝试使用安装了标签的uitextfield:

    var label:UITextField = new UITextField();
    label.text = "test";
    label.selectable = true;
    
    var contextMenu:ContextMenu = new ContextMenu();
    contextMenu.clipboardMenu = true;
    contextMenu.clipboardItems.copy = true;
    contextMenu.clipboardItems.selectAll = true;
    contextMenu.customItems = [new ContextMenuItem("Test Item"), new ContextMenuItem("Test Item 2")];
    
    label.contextMenu = contextMenu;
    
    addChild(label);
    

    此外,您还可以扩展label,将上下文菜单直接应用到内部的uitextfield(此解决方案仅在air中有效,尽管您可以使用context menu istad of native menu,它在air和flash player中都有效):

    package test
    {
    import mx.controls.Label;
    import flash.display.NativeMenu;
    import mx.core.UITextField;
    import mx.core.mx_internal;
    
    use namespace mx_internal;
    public class LabelWithContextMenu extends Label
    {
        public function LabelWithContextMenu()
        {
            super();
        }
    
        override public function get contextMenu():NativeMenu
        {
            if (textField is UITextField)
                return UITextField(textField).contextMenu;
            else
                return super.contextMenu;
        }
    
        override public function set contextMenu(cm:NativeMenu):void
        {
            if (textField == null)
                createTextField(-1);
            if (textField is UITextField)
                UITextField(textField).contextMenu = cm;
            else
                super.contextMenu = cm;
        }
    
    }
    }
    
    推荐文章