2009-07-13 5 views
3

J'ai un ContextMenuStrip qui affiche les éléments qui peuvent être nommés par l'utilisateur; l'utilisateur est autorisé à donner les noms des éléments contenant des esperluettes. Lorsque le ContextMenuStrip est affiché, les éléments traitent les esperluettes comme des séquences d'échappement et soulignent le caractère suivant.Comment est-ce que j'arrête des articles dans un ContextMenuStrip de traiter des esperluettes spécialement?

Je pourrais doubler toutes les esperluettes avant de définir les membres Text des éléments, mais ce membre est utilisé ailleurs dans le code, donc si possible, je voudrais empêcher le ContextMenuStrip de traiter les esperluettes spécialement. Y a-t-il un moyen de désactiver ce comportement?

Répondre

9

utilisation && pour afficher un seul &

Edit: Désolé, j'ai raté la deuxième partie de votre question :(

Vous pouvez toujours lorsque vous définissez utiliser string.Replace("&", "&&") sur le texte, mais Une autre alternative serait d'hériter de ToolStripMenuItem et de remplacer l'ensemble de la propriété Text pour remplacer & par &&. mieux car cela garderait le code une fois.

+0

Je pourrais doubler toutes les esperluettes avant de définir les membres Text des éléments, mais ce membre est utilisé ailleurs dans le code, donc si possible, je voudrais empêcher le ContextMenuStrip de traiter les esperluettes spécialement. Y a-t-il un moyen de désactiver ce comportement? – Simon

+1

Vous pourriez avoir une deuxième propriété que vous utilisez dans la liaison, qui échappe automagiquement aux esperluettes pour ContextMenuStrip. – user7116

0

Je ne pense pas qu'il existe un support intégré pour cela (comme la propriété UseMnemonic du contrôle Button), malheureusement. Une façon de le faire est de faire une méthode force brute qui marche l'arbre de commande sur le formulaire et effectuer un remplacement sur tous ToolStripMenuItems trouvés:

public TheForm() 
{ 

    InitializeComponent(); 
    FixAmpersands(this.Controls); 
} 

private static void FixAmpersands(Control.ControlCollection controls) 
{ 
    foreach (Control control in controls) 
    { 
     if (control is ToolStrip) 
     { 
      FixAmpersands((control as ToolStrip).Items); 
     } 
     if (control.Controls.Count > 0) 
     { 
      FixAmpersands(control.Controls); 
     } 
    } 
} 

private static void FixAmpersands(ToolStripItemCollection toolStripItems) 
{ 
    foreach (ToolStripItem item in toolStripItems) 
    { 
     if (item is ToolStripMenuItem) 
     { 
      ToolStripMenuItem tsmi = (ToolStripMenuItem)item; 
      tsmi.Text = tsmi.Text.Replace("&", "&&"); 
      if (tsmi.DropDownItems.Count > 0) 
      { 
       FixAmpersands(tsmi.DropDownItems); 
      } 
     }     
    } 
} 

Ceci est, bien sûr, surtout utile si la structure de menu n'est pas construit dynamiquement et occasionnellement pendant la durée de vie du formulaire. Si de nouveaux éléments sont ajoutés de temps en temps, vous devrez probablement les exécuter via une méthode qui effectuera le doublage d'esperluette sur un seul élément.