Проблема с проверкой орфографии при вводе.Как изменить шрифт только для части текста? - PullRequest
0 голосов
/ 11 мая 2018

Я пытался реализовать библиотеку проверки орфографии Hunspell, чтобы проверять орфографию, когда я печатаю в приложении для заметок с помощью c #. Кажется, что он работает нормально, но когда появляется слово с ошибкой, весь RichTextBox подчеркивается.

public void spellchecker()
{
    Invoke(new MethodInvoker(delegate ()
    {       
        using (Hunspell hunspell = new Hunspell("en_us.aff", "en_US.dic"))
        {
            String sentence = GetRichTextBox().Text;
            foreach (string item in sentence.Split(' '))
            {
                bool correct = hunspell.Spell(item);
                if (correct == false)

                {
                    GetRichTextBox().Font = new Font(GetRichTextBox().Font, FontStyle.Underline);
                }
                else {
                    GetRichTextBox().Font = new Font(GetRichTextBox().Font, FontStyle.Regular);
                }   

            }           
        }
    }));
}

Ошибка появляется в строке:

GetRichTextBox().Font = new Font(GetRichTextBox().Font, FontStyle.Underline);

Поэтому, когда я заменяю его на:

item.Font = new Font(item.Font, FontStyle.Underline);

.. появляется сообщение об ошибке «Строка не содержит определения шрифта». Я не могу сделать так, чтобы слово с ошибкой было подчеркнуто индивидуально.

1 Ответ

0 голосов
/ 11 мая 2018

Прежде всего, не разбивайте строку на ' ', потому что это будет относиться к «Hello; world», например, как одно слово.Вы должны использовать Regex, чтобы найти слова в строке.Используйте этот шаблон \w+.

Во-вторых, как показано в этот ответ на связанный вопрос, вы можете использовать SelectionColor и SelectionFont свойства для изменения стиля текста после выбора целевого текста .

Это должно работать:

Font fnt = richTextBox1.Font;
Color color;

foreach (Match match in Regex.Matches(richTextBox1.Text, @"\w+"))
{
    string word = match.Value;
    if (!hunspell.Spell(word))
    {
        fnt = new Font(fnt.FontFamily, fnt.Size, FontStyle.Underline);
        color = Color.Red;
    }
    else
    {
        fnt = new Font(fnt.FontFamily, fnt.Size, FontStyle.Regular);
        color = Color.Black;
    }

    richTextBox1.Select(match.Index, match.Length);        // Selecting the matching word.
    richTextBox1.SelectionFont = fnt;                      // Changing its font and color
    richTextBox1.SelectionColor = color;
    richTextBox1.SelectionStart = richTextBox1.TextLength; // Resetting the selection.
    richTextBox1.SelectionLength = 0;
}

Результат:

RichTextBox highlighting

Примечание: я использовал if (word.length < 5) для тестирования, вы можете применить свое собственное условие, как показано в коде выше.

Надеюсь, что поможет.

...