3

カスタム スペル チェッカーを備えた RichTextBox の派生バージョンがあります。スペルミスのある単語の候補のリストを提供してくれます。MS Word と同じ修正機能を実現したいと考えています。

ユーザーが単語を右クリックした場合、単語を 1 つだけ含む文字列を取得するにはどうすればよいですか?

提案のリストを取得したら、それらをリッチテキスト ボックスの ContextMenu に読み込みます。

コンテキスト メニューから単語を選択した後、単語を置き換えるにはどうすればよいですか?

RichTextBox にはテキスト以外のオブジェクトが含まれており、Text プロパティを変更するとそれらが消えるため、TextRange(start,end).Text 全体を操作できないことに注意してください。

4

1 に答える 1

6

以下を使用して、RichTextBox内のマウスの現在の位置をTextPointerとして取得できるはずです(rtbはRichTextBoxです)。

var mousePosition = Mouse.GetPosition(rtb);
var textPointer = rtb.GetPositionFromPoint(mousePosition, false);

ポインタを指定すると、次のようないくつかの方法を使用して、指定した位置の単語を取得および置換できます(ただし、文字が単語としてカウントされるルールを変更することもできます)。

private string GetWordAtPointer(TextPointer textPointer)
{
    return string.Join(string.Empty, GetWordCharactersBefore(textPointer), GetWordCharactersAfter(textPointer));
}

private void ReplaceWordAtPointer(TextPointer textPointer, string replacementWord)
{
    textPointer.DeleteTextInRun(-GetWordCharactersBefore(textPointer).Count());
    textPointer.DeleteTextInRun(GetWordCharactersAfter(textPointer).Count());

    textPointer.InsertTextInRun(replacementWord);
}

private string GetWordCharactersBefore(TextPointer textPointer)
{
    var backwards = textPointer.GetTextInRun(LogicalDirection.Backward);
    var wordCharactersBeforePointer = new string(backwards.Reverse().TakeWhile(c => !char.IsSeparator(c) && !char.IsPunctuation(c)).Reverse().ToArray());

    return wordCharactersBeforePointer;
}

private string GetWordCharactersAfter(TextPointer textPointer)
{
    var fowards = textPointer.GetTextInRun(LogicalDirection.Forward);
    var wordCharactersAfterPointer = new string(fowards.TakeWhile(c => !char.IsSeparator(c) && !char.IsPunctuation(c)).ToArray());

    return wordCharactersAfterPointer;
}
于 2012-08-02T23:37:01.217 に答える