Пользовательское контекстное меню с возможностью выбора в AS3 - PullRequest
0 голосов
/ 06 июня 2009

У меня есть метка в AS3, которую я хочу выбрать (.selectable = true), и я хочу, чтобы clipboardMenu отображался при щелчке правой кнопкой мыши ALONG с пользовательскими элементами меню.

Если я сделаю ЭТО:

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 = ложный. Это делает пункты меню буфера обмена бесполезными.

ЕСЛИ я поменяю строку:

label.selectable = false;

до:

label.selectable = true;

Метка выбирается, однако присутствуют ТОЛЬКО пункты меню буфера обмена.

Как я могу сделать ярлык выбираемым И иметь меню с моими пользовательскими элементами + стандартными элементами буфера обмена?

Спасибо за вашу помощь.

Кстати - это с приложением AIR, использующим 3.2 SDK.

1 Ответ

1 голос
/ 07 июня 2009

Попробуйте использовать 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, хотя вы можете использовать ContextMenu вместо NativeMenu и работать как в 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;
    }

}
}
...