2008-10-16 10 views
8

Ich möchte einen Menüeintrag zum Standard ContextMenu einer RichTextBox hinzufügen.Menüoption zum Standardkontextmenü hinzufügen

Ich könnte ein neues Kontextmenü erstellen, aber dann verliere ich die Rechtschreibprüfung Vorschläge, die im Standardmenü angezeigt werden.

Gibt es eine Möglichkeit, ein Element hinzuzufügen, ohne alles neu zu implementieren?

Antwort

16

Es ist nicht zu schwierig das RichTextBox-Kontextmenü mit Rechtschreibvorschläge, Ausschneiden, Einfügen reimplementieren usw.

das Kontextmenü Eröffnungsveranstaltung Schalte wie folgt:

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

Im Build-Event-Handler das Kontextmenü, wie Sie brauchen. Sie können die vorhandenen Kontextmenü Menüpunkte mit dem folgenden erstellen:

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

Wenn es Rechtschreibfehler sind, können Sie erstellen Alle ignorieren mit:

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

Separatoren hinzufügen je nach Bedarf. Fügen Sie diese den Elementen des neuen Kontextmenüs hinzu und fügen Sie dann Ihre neuen glänzenden Menüelemente hinzu.

Ich werde weiterhin nach einer Möglichkeit suchen, das eigentliche Kontextmenü zu erhalten, da dies für etwas wichtig ist, an dem ich in naher Zukunft arbeiten werde.

+0

Danke, Donnelle. Ich dachte mir, es würde wahrscheinlich wieder umgesetzt werden. Danke für die Tipps, wie das geht! – dmo

+1

Ein sehr ähnliches Beispiel kann direkt auf MSDN gefunden werden: http://msdn.microsoft.com/en-us/library/system.windows.controls.richtextbox.getspellingerror(v=vs.110).aspx –

+0

@ Donnelle Tut mir leid, dass ich zu spät zur Party gekommen bin, aber da ich genau das gleiche Problem habe (außer für mein Szenario mit einer einfachen Textbox) und diese Frage mit dem WPF-Tag, können Sie bitte einen "XAMLish" Weg anbieten? – Yoda