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
    }

WinForm RichTextBox文本颜色更改的字符太多

您的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