为RichTextBox字符串着色的不同部分

Fat*_*510 104 c# string colors richtextbox winforms

我正在尝试为要附加到RichTextBox的字符串部分着色.我有一个由不同字符串构建的字符串.

string temp = "[" + DateTime.Now.ToShortTimeString() + "] " +
              userid + " " + message + Environment.NewLine;
Run Code Online (Sandbox Code Playgroud)

这是消息构建后的样子.

[9:23 pm]网友:我在这里留言.

我希望括号内的所有内容[9:23]都是一种颜色,"用户"是另一种颜色,而消息是另一种颜色.然后我想将字符串附加到我的RichTextBox.

我怎么能做到这一点?

Nat*_*lch 230

这是一个AppendText使用color参数重载方法的扩展方法:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是你如何使用它:

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();
Run Code Online (Sandbox Code Playgroud)

请注意,如果您输出大量消息,可能会发现一些闪烁.有关如何减少RichTextBox闪烁的想法,请参阅此C#Corner文章.

  • 我遇到了一些麻烦.我用在另一个地方`box.Text + = mystring`,所以所有的颜色都消失了.当我用`box.AppendText(mystring)`替换它时,它就像一个魅力. (3认同)
  • 我在使用其他颜色添加字符串时颜色消失的代码有些麻烦.唯一的区别是我将var框分配给以前制作的richtextbox .... (3认同)
  • 这是专门针对WinForms的.你有机会使用WPF吗? (2认同)

小智 12

我用font作为参数扩展了方法:

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;
}
Run Code Online (Sandbox Code Playgroud)


ted*_*bus 8

这是我在代码中添加的修改版本(我使用的是.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();
}
Run Code Online (Sandbox Code Playgroud)

与原始的差异:

  • 可以将文本添加到新行或只是附加它
  • 无需更改选择,它的工作原理相同
  • 插入ScrollToCaret以强制自动滚动
  • 添加了暂停/恢复布局调用


Elo*_*Elo 5

我认为在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);
Run Code Online (Sandbox Code Playgroud)

MSDN

Blocks属性是RichTextBox的content属性。它是段落元素的集合。每个段落元素中的内容可以包含以下元素:

  • 排队

  • InlineUIContainer

  • 跨度

  • 胆大

  • 超连结

  • 斜体

  • 强调

  • 越线

因此,我认为您必须根据零件颜色拆分字符串,并Run根据需要创建尽可能多的对象。

  • 我希望这是我真正寻找的答案,但它似乎是 WPF 答案而不是 WinForms 答案。 (4认同)