我在C#中有简单的Win-form GUI,它根据收到的值显示红色或绿色的文本。只要我没有最小化GUI,RichText就会正确显示文本。当GUI最小化时,“文本”窗口中显示的文本为黑色(仅限GUI最小化时处理的数据)。当GUI最大化时,数据的文本颜色再次正确显示。
请告诉我这里有什么问题。
Here is my code:
LogMessageWindow.Find(message);
LogMessageWindow.SelectionColor = Color.Red; /// if message&2==0 set color to Red otherwise set color to green
LogMessageWindow.SuspendLayout();
LogMessageWindow.Focus();
LogMessageWindow.AppendText(message + ".\n");
LogMessageWindow.ScrollToCaret();*
答案 0 :(得分:0)
在您的代码中,您有:
LogMessageWindow.Find(message);
这一行没用:你正在追加一大块文本。在追加它之前搜索它不会做太多事情(可能找到相同的字符串。然后是什么?)。
LogMessageWindow.SuspendLayout();
如果您批量添加/附加大量文本行, SuspendLayout()
会很有用。完成后,您应该ResumeLayout()
。在这里似乎不需要。
LogMessageWindow.Focus();
将焦点移动到RTB控件并不能完成任何特殊操作。如果容器表单最小化...由于您在程序中添加文本,因此不需要重点。
你可以做几件事。
使用方法,传递对用于此任务的RichTextBox的引用,要使用的颜色以及要追加的文本。
此处新文本颜色定义为Color? color
,如果您通过null
,则会使用控件ForeColor
。
RTBAppendWithColor(LogMessageWindow,
((message & 2) == 0) ? Color.Red : Color.Green,
message.ToString() + "\n");
private void RTBAppendWithColor(RichTextBox rtb, Color? color, string AppendedText)
{
int sLenght = AppendedText.Length;
rtb.AppendText(AppendedText);
rtb.Select(rtb.Text.Length - sLenght, sLenght);
if (color != null)
rtb.SelectionColor = (Color)color;
rtb.ScrollToCaret();
}
使用附加信息。
使用引用RichTextBox对象的静态方法创建静态类。此方法将是您创建的任何RichTextBox的新方法。
LogMessageWindow.AppendWithColor(((message & 2) == 0) ? Color.Red : Color.Green,
message.ToString() + "\n");
public static class RTBExtensions
{
public static void AppendWithColor(this RichTextBox rtb, Color? color, string AppendedText)
{
int sLenght = AppendedText.Length;
rtb.AppendText(AppendedText);
rtb.Select(rtb.Text.Length - sLenght, sLenght);
if (color != null)
rtb.SelectionColor = (Color)color;
rtb.ScrollToCaret();
}
}
如果您使用 FrameWork 3.5 ,即使调用ScrollToCaret()
,选择文本也可能会保持选中状态。如果看起来很难看,请添加:
rtb.SelectionStart = rtb.Text.Length;
在rtb.ScrollToCaret()
之前。
答案 1 :(得分:0)
感谢您的宝贵意见。我能够通过起诉这段代码来完成这项工作。
LogMessageWindow.SelectionStart = LogMessageWindow.TextLength; LogMessageWindow.SelectionLength = 0; LogMessageWindow.SelectionColor = Color.Red; LogMessageWindow.SuspendLayout();
LogMessageWindow.AppendText(message + ".\n"
); LogMessageWindow.ScrollToCaret(); ` LogMessageWindow.ResumeLayout()