我可以使用这段旧代码来更改富文本框中一行的文本颜色吗?
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);
}
没有错误,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);
}