2008-10-16 7 views
8

Je voudrais ajouter un élément de menu à la valeur par défaut ContextMenu d'un RichTextBox.ajouter un élément de menu au menu contextuel par défaut

Je pourrais créer un nouveau menu contextuel, mais je perdrais alors les suggestions de vérification orthographique qui apparaissent dans le menu par défaut.

Existe-t-il un moyen d'ajouter un élément sans tout ré-implémenter?

Répondre

16

Il est pas trop difficile à réimplémenter le menu contextuel RichTextBox avec des suggestions d'orthographe, couper, coller, etc.

Accrocher l'événement d'ouverture du menu contextuel comme suit:

AddHandler(RichTextBox.ContextMenuOpeningEvent, new ContextMenuEventHandler(RichTextBox_ContextMenuOpening), true); 

Dans le gestionnaire d'événements de construction le menu contextuel selon vos besoins. Vous pouvez recréer les éléments de menu du menu contextuel existant avec les éléments suivants:

 
private IList<MenuItem> GetSpellingSuggestions() 
{ 
    List<MenuItem> spellingSuggestions = new List(); 
    SpellingError spellingError = myRichTextBox.GetSpellingError(myRichTextBox.CaretPosition); 
    if (spellingError != null) 
    { 
     foreach (string str in spellingError.Suggestions) 
     { 
      MenuItem mi = new MenuItem(); 
      mi.Header = str; 
      mi.FontWeight = FontWeights.Bold; 
      mi.Command = EditingCommands.CorrectSpellingError; 
      mi.CommandParameter = str; 
      mi.CommandTarget = myRichTextBox; 
      spellingSuggestions.Add(mi); 
     } 
    } 
    return spellingSuggestions; 
} 

private IList<MenuItem> GetStandardCommands() 
{ 
    List<MenuItem> standardCommands = new List(); 

    MenuItem item = new MenuItem(); 
    item.Command = ApplicationCommands.Cut; 
    standardCommands.Add(item); 

    item = new MenuItem(); 
    item.Command = ApplicationCommands.Copy; 
    standardCommands.Add(item); 

    item = new MenuItem(); 
    item.Command = ApplicationCommands.Paste; 
    standardCommands.Add(item); 

    return standardCommands; 
} 

S'il y a des erreurs d'orthographe, vous pouvez créer Ignorer tout avec:

 
MenuItem ignoreAllMI = new MenuItem(); 
ignoreAllMI.Header = "Ignore All"; 
ignoreAllMI.Command = EditingCommands.IgnoreSpellingError; 
ignoreAllMI.CommandTarget = textBox; 
newContextMenu.Items.Add(ignoreAllMI); 

séparateurs Ajouter au besoin. Ajoutez-les aux éléments du nouveau menu contextuel, puis ajoutez vos nouveaux MenuItems brillants.

Je vais continuer à chercher un moyen d'obtenir le menu contextuel actuel, car cela est pertinent pour quelque chose que je vais travailler dans un proche avenir.

+0

Merci, Donnelle. Je pensais que cela viendrait probablement à ré-implémenter. Merci pour les conseils sur la façon de le faire! – dmo

+1

Un exemple très similaire peut être trouvé directement sur MSDN: http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.getspellingerror(v=vs.110).aspx –

+0

@ Donnelle Désolé d'être en retard à la fête, mais étant donné que je suis confronté exactement au même problème (sauf pour mon scénario ayant une simple zone de texte) et cette question ayant le tag WPF, peux-tu donner un style plus "XAMLish"? – Yoda

Questions connexes