c# - 如何替换 richtextbox 中插入符号位置下的单词? - 实现拼写检查建议

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

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

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

获得建议列表后,我会将它们加载到 richtextbox 的上下文菜单中。

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

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

最佳答案

您应该能够使用以下方法(其中 rtb 是 RichTextBox)将鼠标在 RichTextBox 中的当前位置作为 TextPointer 获取:

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

关于c# - 如何替换 richtextbox 中插入符号位置下的单词? - 实现拼写检查建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11776914/

相关文章:

c# - 为什么我们不能从实例对象访问静态成员?

vba - 检测何时将数据添加到文档中,例如。一个字符或空白

vba - 使用 VBA 动态创建书签

vba - 如何在VBA中选择特定项目符号

java - 在 Xamarin 中创建 Android 服务并从 Java native 客户端应用程序调用其方法

c# - 在 ASP.NET Core MVC 的 View 中格式化日期

c# - 一般而言,日志记录是新手,但我应该在 MVC3 应用程序中登录什么?

wpf - 哪个图形子系统用于触摸屏信息亭开发

c# - 使用 Catel 命令在 CanExecuteChanged 上发生内存泄漏

c# - 清除 WPF 中的组合框