以下を使用して、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;
}