在C#中为RichTextBox字符串的不同文本着色

时间:2017-05-09 16:21:24

标签: c# richtextbox

我想使用不同的颜色为richtextbox的不同部分着色,与发布的here相同。

但有一点不同,在我的情况下,我需要使用richtextbox的插入方法在顶部插入消息。

我使用的是经典方法:

myRichTextBox.Text.Insert(0,myMessage);

但是使用它我无法对消息的不同部分进行着色,所以我已经完成了以下扩展方法:

public static class RichTextBoxExtensions
{
    public static string Insert(this string str, int index, RichTextBox box, string text, Color color)
    {
        box.SelectionStart = box.TextLength;
        box.SelectionLength = 0;

        box.SelectionColor = color;
        //box.Text = str.Insert(0, box, text, color);
        box.Text = str.Insert(index, text);
        box.SelectionColor = box.ForeColor;

        return box.Text;
    }
}

然后我通过以下方式从我的程序的任何一点调用它来使用它:

    private void PrintMessage(RichTextBox box, string message, Color color)
    {
        box.Text = box.Text.Insert(0, box, message, color);
    }

但它不起作用,它在扩展方法Insert in line:

中引发异常
box.Text = str.Insert(0, box, text, color);

它说“堆栈溢出”。有什么想法吗?

已更新

    private void PrintMessage(RichTextBox box, string message, Color color)
    {
        box.SelectedText = box.SelectedText.Insert(0, box, message, color);
    }

public static class RichTextBoxExtensions
{
    public static string Insert(this string str, int index, RichTextBox box, string text, Color color)
    {
        box.SelectionStart = box.TextLength;
        box.SelectionLength = 0;

        box.SelectionColor = color;
        box.SelectedText = str.Insert(index, text);
        box.SelectionColor = box.ForeColor;

        return box.Text;
    }
}

但它不起作用,文字看起来没有颜色。

注意

我需要在richtextbox控件的顶部添加文本,而不是在底部,所以我使用的是Insert而不是AppendText。

更新2 : 使用AppendText并将SelectionStart设置为0以将文本附加到richtextbox的顶部,如TaW所说here,在第一次将消息打印到richtextbox时失败。剩下的时间(不是第一次)没问题。

那么如何使它也适用于附加到richtextbox的第一个字符串?

    public static void AppendText(this RichTextBox rtb, string text, Color color)
    {            
        rtb.SelectionStart = 0;            // set the cursor to the target position
        rtb.SelectionLength = 0;           // nothing selected, yet
        rtb.SelectedText = text;           // this inserts the new text 
        rtb.SelectionLength = text.Length; // now we prepare the new formatting
        rtb.SelectionColor = color;
    }

2 个答案:

答案 0 :(得分:0)

要在顶部添加带有颜色变化的文本,我使用了这段代码,对我来说这是最好的解决方案。 它不使用复制/粘贴或文本删除和重写。

 public void Log(RichTextBox myTextBox, string Testo, Color colore)
    {
            myTextBox.SelectionStart = 0;
            myTextBox.SelectionLength = 0;
            myTextBox.SelectionColor= colore;
            myTextBox.SelectedText = Testo;
    }

答案 1 :(得分:-1)

你写错了原型并且实现不对。我制作了一个有效的代码。您只需在表单中添加Richtextbox元素并将其命名为框。

    using System;
using System.Drawing;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
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;
    }
}
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        box.AppendText("[" + DateTime.Now.ToShortTimeString() + "]", Color.Red);
        box.AppendText(" ");
        box.AppendText("GREEN TEXT", Color.Green);
        box.AppendText(": ");
        box.AppendText("BLUE TEXT", Color.Blue);
        box.AppendText(Environment.NewLine);
    }
}
}

要在您的代码中调用它,请按照

进行操作
private void PrintMessage(RichTextBox box, string message, Color color)
 {
     box.Text = box.AppendText(message, color);
 }

enter image description here

代码来自Richtextbox prepend new text with color

UPDATE :: 要在Richtextbox上编写使用这个修改过的代码(我使用剪贴板做了一个脏修复),但它可以正常工作

        public static void AppendTextToTop(this RichTextBox box, string text, Color color)
    {
        Clipboard.Clear();
        box.SelectAll();
        box.Copy();
        box.Clear();
        box.SelectionStart = box.TextLength;
        box.SelectionLength = 0;

        box.SelectionColor = color;
        box.AppendText(text);
        box.SelectionColor = box.ForeColor;

        box.Paste();
    }