我正在研究一个调用python脚本并在richtextbox中显示输出的程序。 我在输出中着色特定字符串时遇到问题。 例如:如果字符串“hey 123”将出现在输出中,它将显示为红色。 有人有答案吗? 谢谢! 我的代码片段:
Process _cmd;
delegate void setTextCallBack(string text);
private void setText (string text)
{
if (this.richTextBox1.InvokeRequired)
{
setTextCallBack d = new setTextCallBack(setText);
this.Invoke(d, new object[] { text });
}
else
{
this.richTextBox1.Text += text + Environment.NewLine;
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.ScrollToCaret();
}
}
_cmd = new Process();
_cmd.StartInfo = cmdStartInfo;
if (_cmd.Start())
{
_cmd.OutputDataReceived += new DataReceivedEventHandler(_cmd_OutputDataReceived);
_cmd.ErrorDataReceived += new DataReceivedEventHandler(_cmd_ErrorDataReceived);
_cmd.Exited += new EventHandler(_cmd_Exited);
_cmd.BeginOutputReadLine();
_cmd.BeginErrorReadLine();
}
else
{
_cmd = null;
}
void _cmd_Exited(object sender, EventArgs e)
{
_cmd.OutputDataReceived -= new DataReceivedEventHandler(_cmd_OutputDataReceived);
_cmd.Exited -= new EventHandler(_cmd_Exited);
}
void _cmd_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
UpdateConsole(e.Data, Brushes.Red);
}
void _cmd_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
UpdateConsole(e.Data, Brushes.Green);
}
private void UpdateConsole (string text)
{
UpdateConsole(text, null);
}
private void UpdateConsole(string text, Brush color)
{
WriteLine(text, color);
}
private void WriteLine(string text, Brush color)
{
if (text != null)
{
setText(text);
}
}
答案 0 :(得分:1)
以下是RichTextBoxes
的黄金法则:请勿触摸文字!
完成任何着色或格式化后,请勿使用richTextBox1.Text += "more text"
附加文字!这会弄乱你拥有的所有格式。您需要的所有功能都有特殊功能,您需要才能使用它们。
添加用途
richTextBox1.AppendText("more text")
编辑时可能需要的其他方法是Copy, Paste & Cut
,当然还有选择属性和方法,您还需要着色和格式化。
要为一段文字着色,您需要选择它然后应用您想要的颜色:
richTextBox1.SelectionBackColor = Color.MistyRose; // Backcolor
richTextBox1.SelectionColor = Color.Red; // TextColor
其他格式将使用SelectionFont
,SelectionIndent
,SelectionAlignment
,然后使用一些..
正如你所看到的那样,首先选择然后再进行选择。
在您的代码中,您可以将setText方法标题更改为:
setText (string text, Color color)
并更改其代码:
else
{
int start = richTextBox1.Text.Length; //*
richTextBox1.AppendText(text + Environment.NewLine);
richTextBox1.SelectionStart = start; //*
richTextBox1.SelectionLength = text.Length;
richTextBox1.SelectionColor = color;
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.SelectionLength = 0;
richTextBox1.ScrollToCaret();
}
最后三行是可选的;我把它们包括在内,因为你似乎总是想要Caret。
我还可以通过将函数的名称更改为 addText 或 addColoredText 来使其更具可读性,甚至可以通过添加bool参数来控制是否更灵活是否应添加NewLine
..
更新:
我注意到您还使用UpdateConsole
为WriteLine
调用了null
和Brushes
方法。
这有两个问题:
Brush
而是Color
来为RichTextBox
着色。 null
Color
。您可以通过声明SolidBrushes
并使用他们的brush.Color
来解决这个问题。
但这只是一种无用且令人困惑的扭曲。
而是直接传递您想要的Color
而不是Black
或RTF的ForeColor
中的空传递或您定义的默认颜色..:
UpdateConsole(text, Color.Black);
或
UpdateConsole(text, richTextBox1.ForeColor);
等。
更新2
请注意代码中的更正(*); AppendText移动SelectionStart,因此我们需要存储起始值。
如果您有错误消息列表,请说
List<string> errors;
您可以从文件中填写,也许是这样:
errors = File.ReadAllLines("d:\\errors.txt").ToList();
然后测试平等:
setText(text, errors.Contains(text) ? Color.Red : Color.Blue);
或者,如果只有部分匹配
setText(text, isError(text) ? Color.Red : Color.Blue);
使用这样的函数:
bool isError(string msg)
{ foreach (string err in errors)
if (msg.IndexOf(err) >= 0) return true; return false; }