добавить пункт меню в контекстное меню по умолчанию

Я хотел бы добавить пункт меню по умолчанию ContextMenu из RichTextBox.

Я мог бы создать новое контекстное меню, но тогда я потерял бы предложения проверки орфографии, которые отображаются в меню по умолчанию.

Есть ли способ добавить элемент без повторной реализации всего?


person dmo    schedule 16.10.2008    source источник


Ответы (1)


Не так уж сложно заново реализовать контекстное меню RichTextBox с вариантами написания, вырезания, вставки и т. д.

Подключите событие открытия контекстного меню следующим образом:

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

В обработчике событий создайте контекстное меню по своему усмотрению. Вы можете воссоздать существующие пункты меню контекстного меню со следующим:

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

Если есть орфографические ошибки, вы можете создать «Игнорировать все» с помощью:

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

Добавьте разделители по мере необходимости. Добавьте их к новым элементам контекстного меню, а затем добавьте новые блестящие элементы MenuItems.

Я собираюсь продолжать искать способ получить фактическое контекстное меню, так как это имеет отношение к чему-то, над чем я буду работать в ближайшем будущем.

person Donnelle    schedule 17.10.2008
comment
Спасибо, Доннелл. Я подумал, что, вероятно, дело дойдет до повторной реализации. Спасибо за советы как это сделать! - person dmo; 20.10.2008
comment
Очень похожий пример можно найти непосредственно в MSDN: msdn.microsoft.com/en-us/library/ - person Steve Cadwallader; 17.08.2012
comment
@Donnelle Извините за опоздание на вечеринку, но поскольку я столкнулся с точно такой же проблемой (за исключением моего сценария с простым текстовым полем) и этот вопрос имеет тег WPF, не могли бы вы предоставить более XAML-способ, пожалуйста? - person Yoda; 29.09.2016
comment
Я бы с удовольствием, Йода, но я не работал с XAML уже 7 лет! - person Donnelle; 30.09.2016