2010-08-12 16 views
2

je voulais changer le menu par défaut de contexte de zone de texte, donc je crée mon propre menu et les je lui a assigné comme çaComment changer (et plus tard à restaurer) menu contextuel par défaut dans textbox

texbox.ContextMenu = myContextMenu 

Cependant, je ne suis pas savoir comment restaurer le menu par défaut de la zone de texte (dans une exécution). J'ai besoin de myContextMenu pour montrer seulement quand je clique sur la zone de texte avec le bouton droit de la souris (tout en maintenant le bouton de contrôle). Dans d'autres cas, j'ai besoin de contextmenu de textbox par défaut pour montrer. Est-ce possible?

Répondre

0

En fait, ce serait plus difficile à faire que ce que l'on pourrait croire. Je crois que le menu contextuel par défaut fait partie du modèle réel du contrôle.

L'approche la plus simple, si vous voulez seulement couper/copier/coller, est de créer un second ContextMenu implémentant ces options. Si vous le faites, vous pouvez utiliser le ApplicationCommands intégré pour implémenter non seulement la fonctionnalité, mais aussi pour localiser automatiquement ce ContextMenu.

+0

Je l'essaie, mais peut-être que je peux en quelque sorte copier le menu par défaut pour séparer l'objet? Peut-être avec lecteur xaml ou sth? – Dante

2

Voici l'exemple donné par Microsoft:

http://msdn.microsoft.com/en-us/library/ms750420.aspx

Pour mémoire, voici la façon de le faire en utilisant WinForms:

public partial class TextBoxContextMenuDemo : Form 
{ 
    ContextMenu mnuContextDefault; 
    ContextMenu mnuContextAlt; 

    MenuItem mnuItmAltMenuTest; 

    public TextBoxContextMenuDemo() 
    { 
     InitializeComponent(); 
     InitializeAltContextMenu(); 
    } 

    private void InitializeAltContextMenu() 
    { 
     mnuContextDefault = new ContextMenu(); 
     mnuContextDefault = this.TextBox1.ContextMenu; 

     mnuItmAltMenuTest = new MenuItem(); 
     mnuItmAltMenuTest.Index = -1; 
     mnuItmAltMenuTest.Text = "Test Menu Item"; 
     mnuItmAltMenuTest.Click += new System.EventHandler(this.mnuItmAltMenuTest_Click); 

     mnuContextAlt = new ContextMenu(); 
     mnuContextAlt.MenuItems.Add(mnuItmAltMenuTest); 
    } 

    private void TextBox1_MouseDown(object sender, MouseEventArgs e) 
    { 
     if (e.Button == MouseButtons.Right) 
     { 
      if ((Control.ModifierKeys == Keys.Control)) 
      { 
       this.TextBox1.ContextMenu = mnuContextAlt; 
       TextBox1.ContextMenu.Show(TextBox1, new Point(e.X, e.Y)); 
      } 
      else 
      { 
       this.TextBox1.ContextMenu = mnuContextDefault; 
      } 
     } 
    } 

    private void mnuItmAltMenuTest_Click(object sender, System.EventArgs e) 
    { 
     MessageBox.Show("You clicked the alternate test menu item!"); 
    } 
} 

HTH!

+0

Ugh, plus d'exemple de code MSDN mal écrit. Entre autres problèmes, il est assez redondant d'initialiser 'mnuContextDefault' avec un objet * new *' ContextMenu', puis de le définir immédiatement sur 'TextBox1.ContextMenu'. Et ce code ne restaure jamais le menu contextuel par défaut, en dépit de tant de problèmes pour le sauvegarder. –

+0

Attendez ... cet exemple de code * n'est pas * de l'article MSDN lié. Cela ne dit rien de ce que vous avez posté ici. Où est-ce que tu as eu çà? –

+0

@CodyGray J'ai écrit ce code. Je m'excuse pour l'erreur que vous avez signalée (initialisation redondante). Je tiens à souligner que le code _does_ restaure le menu contextuel par défaut si le bouton ctrl n'est pas pressé en cliquant avec le bouton droit sur la zone de texte. – EtherealMonkey

0

Vous pouvez simplement définir la propriété ContextMenu à null. L'événement OnContextMenuOpening peut également vous aider.