WinForm RichTextBox文本颜色更改的字符太多
本文关键字:字符 太多 RichTextBox 文本 颜色 WinForm | 更新日期: 2023-09-27 18:25:58
我已经在winforms应用程序中使用rtf框一段时间了,该应用程序作为外部硬件设备和PC之间的串行通信接口运行。我遇到的问题是,当使用任何颜色变化的例子来选择文本(在我通过串行执行实际命令之前发送)时,从外部设备返回的回波也会改变一些文本颜色。
发送符号";"我从我的设备上得到了回声和回复,都是彩色的文本。
;;[UART+ERROR]
我的接收事件处理程序是标准的:
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
//fking threading
string rxString = serialPort1.ReadExisting(); // running on worker thread
this.Invoke((MethodInvoker)delegate
{
textLog.AppendText(rxString); // runs on UI thread
});
}
为了写到屏幕上,我使用了下面的例子(我也尝试过很多其他例子)来处理我的应用程序。我不确定自己做错了什么。
private void AppendTextColor(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;
// could set box.SelectionBackColor, box.SelectionFont too.
}
box.SelectionLength = 0; // clear
}
您的Select()调用将SelectionStart属性留在附加文本的开头,而不是文本的末尾。你可以像对SelectionLength那样恢复它,但更简单的方法是:
private static void AppendTextColor(RichTextBox box, Color color, string text) {
box.SelectionStart = box.Text.Length; // Optional
var oldcolor = box.SelectionColor;
box.SelectionColor = color;
box.AppendText(text);
box.SelectionColor = oldcolor;
}
请注意//可选注释,当用户无法编辑文本时不需要它。
请注意,您的代码中有一个非常严重的消防软管问题。您正在以非常高的速率调用Invoke(),当盒子开始装满时,可能会导致UI线程开始燃烧100%的内核。当这种情况发生时,很容易判断,您再也看不到更新,并且您的程序停止对输入做出响应。需要在DataReceived事件处理程序中进行缓冲,使用ReadLine()而不是ReadExisting()通常是实现这一点的简单方法。而使用BeginInvoke(),Invoke(()很可能会导致SerialPort.Close()调用死锁。
您需要将颜色重置为RTB的正常文本颜色:
box.SelectionStart = box.Text.Length; // clear..
box.SelectionLength = 0; // clear // ..selection
box.SelectionColor = box.ForeColor; // reset color