为RichTextBoxstring的不同部分着色

我试图给一个string的部分添加一个RichTextBox。 我有一个从不同的stringbuild立的string。

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

这是消息一旦构build就会是什么样子。

[9:23 pm]网友:我的消息在这里。

我希望括号内的所有内容(9:23)都是一种颜色,“用户”是另一种颜色,而消息是另一种颜色。 然后我想把这个string添加到我的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(); 

请注意,如果输出大量的信息,您可能会注意到闪烁。 关于如何减lessRichTextBox闪烁,请参阅C#angular文章。

我已经扩展了字体作为参数的方法:

 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(); } 

与原来的差异:

  • 添加文本到一个新行或者简单地追加它的可能性
  • 不需要改变select,它的工作原理是一样的
  • 插入ScrollToCaret强制自动滚动
  • 添加暂停/恢复布局调用

根据某人的说法select文本,可以暂时出现select。 在Windows Forms applications中没有其他解决scheme的问题,但今天我发现了一个不好的,工作的方式来解决:你可以把一个PictureBox重叠到RichtextBox的截图if,在select和改变颜色或字体,使其在操作完成后全部重新出现。

代码在这里…

 //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; 这个解决scheme并不完美,但是对于Winform来说,它是可行的。