Цвет различных частей строки RichTextBox

Я пытаюсь раскрасить части строки, добавляемые в RichTextBox. У меня есть строка, построенная из разных строк.

string temp = "[" + DateTime.Now.ToShortTimeString() + "] " + userid + " " + message + Environment.NewLine; 

Это будет выглядеть сообщение после его создания.

[9:23 pm] Пользователь: мое сообщение здесь.

Я хочу, чтобы все внутри и в том числе скобки [9:23] были одним цветом, «пользователь» – другим цветом, а сообщение – другим цветом. Затем я хотел бы, чтобы строка была добавлена ​​к моему RichTextBox.

Как я могу это сделать?

Ниже приведен метод расширения, который перегружает метод AppendText параметром цвета:

 public static class RichTextBoxExtensions { public static void AppendText(this RichTextBox box, string text, Color color) { box.SelectionStart = box.TextLength; box.SelectionLength = 0; box.SelectionColor = color; box.AppendText(text); box.SelectionColor = box.ForeColor; } } 

И вот как вы его используете:

 var userid = "USER0001"; var message = "Access denied"; var box = new RichTextBox { Dock = DockStyle.Fill, Font = new Font("Courier New", 10) }; box.AppendText("[" + DateTime.Now.ToShortTimeString() + "]", Color.Red); box.AppendText(" "); box.AppendText(userid, Color.Green); box.AppendText(": "); box.AppendText(message, Color.Blue); box.AppendText(Environment.NewLine); new Form {Controls = {box}}.ShowDialog(); 

Обратите внимание, что вы можете заметить мерцание, если вы выводите много сообщений. См. Статью C # Corner для размышлений о том, как уменьшить мерцание RichTextBox.

Я расширил метод с помощью шрифта в качестве параметра:

 public static void AppendText(this RichTextBox box, string text, Color color, Font font) { box.SelectionStart = box.TextLength; box.SelectionLength = 0; box.SelectionColor = color; box.SelectionFont = font; box.AppendText(text); box.SelectionColor = box.ForeColor; } 

Это модифицированная версия, которую я вставлял в свой код (я использую .Net 4.5), но я думаю, что он тоже должен работать на 4.0.

 public void AppendText(string text, Color color, bool addNewLine = false) { box.SuspendLayout(); box.SelectionColor = color; box.AppendText(addNewLine ? $"{text}{Environment.NewLine}" : text); box.ScrollToCaret(); box.ResumeLayout(); } 

Различия с оригинальным:

  • возможность добавить текст в новую строку или просто добавить его
  • нет необходимости менять выбор, он работает одинаково
  • вставляемый ScrollToCaret для принудительного прокрутки
  • добавлены вызовы приостановки / возобновления макета

Выбрав текст, как сказал кто-то, возможно, выбор появится кратковременно. В Windows Forms applications нет других решений проблемы, но сегодня я нашел плохой рабочий способ: вы можете поместить PictureBox в наложение на RichtextBox со RichtextBox экрана, если во время выбора и изменения цвета или шрифт, создавая его после повторного появления всех, когда операция завершена.

Код здесь …

 //The PictureBox has to be invisible before this, at creation //tb variable is your RichTextBox //inputPreview variable is your PictureBox using (Graphics g = inputPreview.CreateGraphics()) { Point loc = tb.PointToScreen(new Point(0, 0)); g.CopyFromScreen(loc, loc, tb.Size); Point pt = tb.GetPositionFromCharIndex(tb.TextLength); g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(pt.X, 0, 100, tb.Height)); } inputPreview.Invalidate(); inputPreview.Show(); //Your code here (example: tb.Select(...); tb.SelectionColor = ...;) inputPreview.Hide(); 

Лучше использовать WPF; это решение не идеально, но для Winform оно работает.

 private void Log(string s , Color? c = null) { richTextBox.SelectionStart = richTextBox.TextLength; richTextBox.SelectionLength = 0; richTextBox.SelectionColor = c ?? Color.Black; richTextBox.AppendText((richTextBox.Lines.Count() == 0 ? "" : Environment.NewLine) + DateTime.Now + "\t" + s); richTextBox.SelectionColor = Color.Black; } 

Я думаю, что изменение «выделенного текста» в RichTextBox – это неправильный способ добавления цветного текста. Итак, вот способ добавления «цветного блока»:

  Run run = new Run("This is my text"); run.Foreground = new SolidColorBrush(Colors.Red); // My Color Paragraph paragraph = new Paragraph(run); MyRichTextBlock.Document.Blocks.Add(paragraph); 

Из MSDN :

Свойство Blocks – это свойство содержимого RichTextBox. Это compilation элементов абзаца. Содержимое каждого элемента абзаца может содержать следующие элементы:

  • В очереди

  • InlineUIContainer

  • Бег

  • пядь

  • Жирный

  • Гиперссылка

  • курсивный

  • подчеркивание

  • Разрыв строки

Поэтому я думаю, что вам нужно разделить свою строку в зависимости от цвета детали и создать столько объектов Run сколько необходимо.

  • Как написать обратную косую черту (\) в строке?
  • Объединить несколько строк в XML?
  • как заменить несколько строк в Oracle
  • Как удалить все неабелевые числовые символы из строки в MySQL?
  • Правильный способ разбить std :: string на вектор
  • Java-способ проверить, является ли строка палиндром
  • Java-эквиваленты C # String.Format () и String.Join ()
  • Разделить строку на строковый массив одиночных символов
  • Как превратить формулу строки в «реальную» формулу
  • Преобразовать текст camelCaseText в текст предложения
  • Преобразование строки в дату на C ++
  • Давайте будем гением компьютера.