WinForm RichTextBox文本颜色变化太多字符

时间:2014-10-09 05:52:35

标签: c# .net winforms colors richtextbox

我在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
    }

2 个答案:

答案 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