如何在richtextbox中替换插入位置下的单词? - 实施拼写检查建议

时间:2012-08-02 11:57:54

标签: c# wpf ms-word richtextbox spell-checking

我有一个带有自定义拼写检查器的RichTextBox派生版本。他们为我提供了一个拼写错误的单词的建议列表。 我希望实现与MS Word中相同的校正功能

如果用户右键单击某个单词,如何获取仅包含1个单词的字符串?

获得建议列表后,我会将它们加载到richtextbox的ContextMenu中。

从上下文菜单中选择一个单词后,如何替换单词?

注意我不能对整个TextRange(开始,结束).Text 进行操作,因为RichTextBox包含除文本以外的对象,如果我修改Text属性它们会消失。

1 个答案:

答案 0 :(得分: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;
}