質問

RichTextBox のデフォルトの ContextMenu にメニュー項目を追加したい。

新しいコンテキストメニューを作成できましたが、デフォルトメニューに表示されるスペルチェックの提案が失われます。

すべてを再実装せずにアイテムを追加する方法はありますか?

役に立ちましたか?

解決

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

必要に応じてセパレータを追加します。それらを新しいコンテキストメニューの項目に追加してから、光沢のある新しいMenuItemを追加します。

実際のコンテキストメニューを取得する方法を探し続けますが、これは近い将来私が取り組んでいる何かに関連するものです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top