我可以使用这段旧代码来更改富文本框中一行的文本颜色吗?

Can I use this old snippet of code to change the text color of one line in a Rich Text Box?

没有错误,RichTextBox 字段中文本的颜色没有改变。

这是一个基于 c# 的简单文本游戏(我是新手)。我在网上尝试了多种不同的解决方案,但都无济于事。我发现这段 2006 年的旧代码似乎没有错误,但似乎没有任何改变。我假设发生故障的地方是实际上没有选择文本,尽管语法似乎是正确的。我试过以读取文本长度的形式插入一些调试代码,它给出了正确的数字——在这个例子中,选择长度显示为 26,这是正确的。

void AppendText(RichTextBox box, Color color, string text)
    {
        int start = box.TextLength;
        box.AppendText(text);
        int end = box.TextLength;

        //Textbox may transform chars, so (end-start) != text.Length
        box.Select(start, end - start);
        {
            box.SelectionColor = color;
        }
        box.SelectionLength = 0;
        box.Text += Environment.NewLine;
    }

//which is being called by:

AppendText(rtbMessages, Color.Red, "Yarr Matey, this be a test");

我希望它将此文本更改为红色。它不会改变文本颜色。

有趣的是,如果(而不是 box.SelectionColor)您插入 box.Forecolor,它确实会将整个文本框更新为红色 - 让我相信选择部分是损坏的 link.

运行这段代码没有错误。

我读到使用 += 附加文本会重置所有应用的颜色,因此无论您的代码的早期部分取得了怎样的成功,它们很可能会被最后一行抹掉!

我在评论中链接了一个相关的SO问题;它看起来与您的大致相似,但 225 多人似乎很欣赏它的工作原理。这是一个扩展方法,因此您需要在静态 class 中声明它,但它会在您拥有的任何 RichTextBox 上巧妙地可用..


编辑:所以你说它有效,但你不希望更改所有代码

我猜你的代码是这样的:

AppendText(rtbMessages, Color.Red, "Yarr Matey, this be a test");
AppendText(rtbMessages2, Color.Blue, "Yarr Matey, this be a test 2");
AppendText(rtbMessages3, Color.Green, "Yarr Matey, this be a test 3");

要么更改您的 AppendText 方法(它们都在调用),以便它调用扩展:

public static class RichTextBoxExtensions
{
  //this is THE EXTENSION method
  public static void AppendText(this RichTextBox box, string text, Color color)
  {
    ...
  }
}


//this is YOUR code
void AppendText(RichTextBox box, Color color, string text)
{
    //call THE EXTENSION code
    box.AppendText(color, text);
}

//now your code, calls your code, calls the extension
AppendText(rtbMessages, Color.Red, "Yarr Matey, this be a test");

或运行在您的代码中查找替换:

FIND: AppendText\((\w+), (.*)
REPL: .AppendText()


AppendText(rtbMessages, Color.Red, "Yarr Matey, this be a test");
           ^^^^^^^^^^^  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                       

它将转换您的所有代码:

FROM: AppendText(rtb1, color, text);
TO:   rtb1.AppendText(color, text);

我最近使用以下方法做了完全相同的事情。

新class

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

然后点击按钮

 private async void btnCheck_Click(object sender, EventArgs e)
    {
        rtbMessages.AppendText("My yellow text", Color.Yellow);
    }