Используйте этот ответ как ссылку для результатов:
Как раскрасить разные слова разными цветами в RichTextBox
Этот объект класса используется для отслеживания слов, которые нужно раскрасить, и связанного с ними цвета, используемого при написании или изменении одного из следующих слов:
(Связанный ответ объясняет, как заполнить список словами и связанными цветами)
public class ColoredWord
{
public string Word { get; set; }
public Color WordColor { get; set; }
}
public List<ColoredWord> ColoredWords = new List<ColoredWord>();
В событии RichTextBox
KeyUp()
проверьте, вставляется или изменяется слово в списке:
Здесь я использую событие KeyUp()
, потому что на данный момент оно уже вставлено / изменено.
private void richTextBox1_KeyUp(object sender, KeyEventArgs e)
{
if ((e.KeyCode >= Keys.Left & e.KeyCode <= Keys.Down)) return;
if (e.KeyCode == Keys.ShiftKey || e.KeyCode == Keys.Alt || e.KeyCode == Keys.ControlKey) return;
int CurrentPosition = richTextBox1.SelectionStart;
int[] WordStartEnd;
string word = GetWordFromPosition(richTextBox1, CurrentPosition - 1, out WordStartEnd);
ColoredWord result = ColoredWords.FirstOrDefault(s => s.Word == word.ToUpper());
SetSelectionColor(richTextBox1, result, CurrentPosition, WordStartEnd);
if (e.KeyCode == Keys.Space && result == null)
{
word = GetWordFromPosition(richTextBox1, CurrentPosition + 1, out WordStartEnd);
result = ColoredWords.FirstOrDefault(s => s.Word == word.ToUpper());
SetSelectionColor(richTextBox1, result, CurrentPosition, WordStartEnd);
}
}
Это вспомогательные методы, которые используются для окраски слова, когда оно включено в список, и для извлечения слова из текущей позиции каретки.
Случай, когда уже окрашенное слово разделяется пробелом, таким образом оба конца теряют их цвет, обрабатывается в событии KeyUp()
(часть кода: if (e.KeyCode == Keys.Space && result == null
).
private void SetSelectionColor(RichTextBox ctl, ColoredWord word, int Position, int[] WordStartEnd)
{
ctl.Select(WordStartEnd[0], WordStartEnd[1]);
if (word != null)
{
if (ctl.SelectionColor != word.WordColor)
ctl.SelectionColor = word.WordColor;
}
else
{
if (ctl.SelectionColor != ctl.ForeColor)
ctl.SelectionColor = ctl.ForeColor;
}
ctl.SelectionStart = Position;
ctl.SelectionLength = 0;
ctl.SelectionColor = richTextBox1.ForeColor;
}
private string GetWordFromPosition(RichTextBox ctl, int Position, out int[] WordStartEnd)
{
int[] StartEnd = new int[2];
StartEnd[0] = ctl.Text.LastIndexOf((char)Keys.Space, Position - 1) + 1;
StartEnd[1] = ctl.Text.IndexOf((char)Keys.Space, Position);
if (StartEnd[1] == -1) StartEnd[1] = ctl.Text.Length;
StartEnd[1] -= StartEnd[0];
WordStartEnd = StartEnd;
return ctl.Text.Substring(StartEnd[0], StartEnd[1]);
}