2009-06-06 8 views
0

J'ai une étiquette dans AS3 que je veux être sélectionnable (.selectable = true) ET je veux que le menu clipboard apparaisse en cliquant-droit sur ALONG avec les éléments de menu personnalisés.Menu contextuel personnalisé avec sélectionnable activé dans AS3

Si je fais ceci

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); 

Cela fonctionne PRESQUE - en ce que lorsque je clic droit sur l'étiquette, je reçois un menu qui a les éléments du presse-papiers et mes articles personnalisés .... CEPENDANT, la le texte de l'étiquette EST NON SELECTABLE en raison de .selectable = false. Cela rend les éléments du menu Presse-papiers inutiles.

Si je change la ligne:

label.selectable = false; 

à:

label.selectable = true; 

L'étiquette est sélectionnable - mais UNIQUEMENT les éléments du menu du presse-papiers sont présents.

Comment puis-je rendre l'étiquette sélectionnable ET avoir un menu avec mes éléments personnalisés + éléments de presse-papiers standard?

Merci pour votre aide.

BTW - c'est avec une application AIR utilisant le SDK 3.2.

Répondre

1

Essayez d'utiliser UITextField insted de label:

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); 

Vous pouvez également étendre l'étiquette pour appliquer le menu contextuel directement à la UITextField interne (cette solution ne fonctionne que dans AIR, mais vous pouvez utiliser ContextMenu istead de NativeMenu et cela fonctionnera à la fois dans AIR et dans le lecteur flash):

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; 
    } 

} 
} 
+0

Très bel exemple - excellente solution. Merci beaucoup. +1 AVEC la case à cocher. Très appréciée. – Gabriel

Questions connexes