我在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
}
答案 0 :(得分:2)
您的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()调用死锁。
答案 1 :(得分:1)
您需要将颜色重置为RTB的正常文本颜色:
box.SelectionStart = box.Text.Length; // clear..
box.SelectionLength = 0; // clear // ..selection
box.SelectionColor = box.ForeColor; // reset color