Автозамена в WPF Richtextbox

Я прочитал на MSDN, что .NET 4.6.1 теперь поддерживает автокоррекцию. Файлы в %appdata%/Microsoft/Spelling// были созданы автоматически, и я добавил следующую строку в default.acl (файл по-прежнему UTF-16 с BOM):

tramampoline|trampoline

Я настроил проект на 4.6.1 и включил проверку правописания в RichTextBox:

<RichTextBox SpellCheck.IsEnabled="True" Language="de-DE"/>

Хотя он выделяет слово при неправильном вводе обычным образом, автоисправление не происходит.

Что мне здесь не хватает? Я не совсем понял примечание:

Примечание. Эти новые форматы файлов напрямую не поддерживаются API проверки орфографии WPF, и пользовательские словари, предоставляемые WPF в приложениях, должны продолжать использовать файлы .lex.


person Klaus Eckelt    schedule 17.12.2015    source источник
comment
Когда я добавляю трамбамполин в файл default.dic, Richtextbox больше не помечает слово как написанное с ошибкой.   -  person Klaus Eckelt    schedule 17.12.2015
comment
При щелчке правой кнопкой мыши на трамбамполин я также получаю строку из файла .acl, предложенную в качестве замены. Но я хотел бы, чтобы он заменялся автоматически (как обычно работает автокоррекция) при нажатии (например) пробела.   -  person Klaus Eckelt    schedule 17.12.2015
comment
Ссылка на файлы .acl в статье MSDN существует для полноты описания регистрации словаря ISpellChecker в %appdata%. Я думаю, что эта ссылка несколько вводит в заблуждение — WPF не ввел автокоррекцию. Скорее, WPF использует этот базовый механизм регистрации словарей в той мере, в какой словари соответствуют его возможностям, а именно обнаружению ошибок и предложениям предложений. В статье MSDN, вероятно, необходимо четко прояснить этот момент.   -  person Vatsan    schedule 24.12.2015


Ответы (1)


Я знаю, что это старо, но, насколько я знаю, вам нужно обрабатывать автозамену самостоятельно (если я ошибаюсь, поправьте меня примером). Вы можете сделать это следующим образом:

var caretPosition = richTextBox.CaretPosition;
// Make sure you're passing a textpointer at the end of the word you want to correct, i.e. not like this ;)
errorPosition = richTextBox.GetNextSpellingErrorPosition(caretPosition, LogicalDirection.Backward);
if(errorPosition == null)
{
    return;
}

var errors = richTextBox.GetSpellingError(errorPosition);
// Default would be to only replace the text if there is one available replacement
// but you can also measure which one is most likely with a simple string comparison
// algorithm, e.g. Levenshtein distance
if (errors.Suggestions.Count() == 1) 
{
    var incorrectTextRange = richTextBox.GetSpellingErrorRange(errorPosition);
    var correctText = error.Suggestions.First();
    var incorrectText = incorrectTextRange.Text;

    // Correct the text with the chosen word...
    errors.Correct(correctText);
}

// Set caret position...

Важным примечанием будет не использование CaretPosition в RTB, а использование текстового указателя в конце слова, которое вы хотите исправить. Если ваш текстовый указатель/каретка находится в странном месте (например, в конце 20 пробелов), метод GetNextSpellingErrorPosition может занять до 60 секунд, прежде чем он вернется (в зависимости от оборудования/количества слов в вашем RTB).

person NathanK    schedule 08.03.2019