2013-09-22 4 views
0

У меня есть функция, которая добавляет текст в RichTextBox в определенном формате, а затем окрашивает только сообщение. Это функция:Индивидуальный цвет в элементе управления RichTextBox - C#

internal void SendChat(Color color, string from, string message) 
     { 
      if (rtbChat.InvokeRequired) 
      { 
       rtbChat.Invoke(new MethodInvoker(() => SendChat(color, from, message))); 
       return; 
      } 

      string Text = String.Format("[{0}] {1}: {2}", DateTime.Now.ToString("t"), from, message); 
      rtbChat.AppendText(Text); 
      rtbChat.Find(message); 
      rtbChat.SelectionColor = color; 

      rtbChat.AppendText("\r\n"); 

      rtbChat.ScrollToCaret(); 
     } 

Выход примерно так:

[12:21 AM] Tester: Hello! 

Однако, когда я печатаю небольшое предложение, такое с 2-мя буквами, иногда цвет не появляется, а иногда это делает. Я боюсь, что это связано с свойством Selection Color. Есть ли лучший способ сделать это или исправить?

+0

Рассмотрите изменение имени переменной 'from', поскольку это ключевое слово. Просто говорю, хотя –

+0

Я пробовал, и он отлично работает. Хотя, когда вы отправляете два одинаковых сообщения, он выделяет только один из них, первый в богатом текстовом поле. Это ваша проблема? –

+0

@OndrejJanacek Это клиент чата TCP. Он прекрасно читает сообщение, но по какой-то причине только длинный текст окрашивается. И небольшой текст, такой как «а», нет. Вот, посмотри: http://puu.sh/4xoqo.png – user2801648

ответ

1

Попробуйте окрасить текст как добавить сообщение:

rtbChat.AppendText(string.Format("[{0}] {1}: ", DateTime.Now.ToString("t"), from)); 
rtbChat.SelectionColor = color; 
rtbChat.AppendText(message); 
rtbChat.SelectionColor = Color.Black; 
rtbChat.AppendText(Environment.NewLine); 
rtbChat.ScrollToCaret(); 
0

Смотрите, если это помогает;

internal void SendChat(Color color, string from, string message) 
    { 
     if (rtbChat.InvokeRequired) 
     { 
      rtbChat.Invoke(new MethodInvoker(() => SendChat(color, from, message))); 
      return; 
     } 

     string Text = String.Format("[{0}] {1}: {2}", DateTime.Now.ToString("t"), from, message); 
     rtbChat.AppendText(Text);//Append text to rtbChat. 
     //To speed up searching and highlighting text,its better to limit it to current line. 
     int line = rtbChat.GetLineFromCharIndex(rtbChat.SelectionStart);//Get current line's number. 
     string currenttext = rtbChat.Lines[line];//Get text of current line. 
     Match match = Regex.Match(currenttext, message);//Find a match of the message in current text. 
     if (match.Success)//If message is found. 
     { 
      int position = rtbChat.SelectionStart;//Store caret's position before modifying it manually. 
      rtbChat.Select(match.Index + rtbChat.GetFirstCharIndexFromLine(line), match.Length);//Select the match. 
      rtbChat.SelectionColor = color;//Apply color code. 
      rtbChat.SelectionStart = position;//Restore caret's position. 
     } 
     rtbChat.Text += Environment.NewLine;//Append a new line after each operation. 
    } 

Ну, честно говоря, это что-то вроде подсветки синтаксиса. Но я надеюсь, что это поможет вам.

Смежные вопросы