Цвет текста WinForm RichTextBox меняет слишком много символов

1

Я некоторое время работаю с rtf-блоком в моем winforms-приложении, запущенном как интерфейс связи между моим внешним аппаратным устройством и моим компьютером через последовательный порт. Проблема заключается в том, что при использовании любого примера изменения цвета для выбора текста (который отправляется до моей фактической команды по последовательному), эхо от моего внешнего устройства также имеет некоторый цвет текста.

отправка символа ';' Я получаю эхо назад и ответ от моего устройства окрашен в текст.

;;[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
    поэтому вы хотите разделить команду и ответ по цвету, а цвет текста команды - черный (по умолчанию), а ответ - красный, но когда вы добавляете ответ в RichTextBox, текст команды тоже становится красным?
  • 0
    Верно! Это делает их легче читать, когда сделано так!
Показать ещё 1 комментарий
Теги:
winforms
colors
richtextbox

2 ответа

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() с очень высокой скоростью, что может привести к тому, что поток пользовательского интерфейса начнет записывать 100% -ное ядро, когда коробка начнет заполняться. Легко сказать, когда это произойдет, вы больше не видите обновлений, и ваша программа перестает отвечать на ввод. Буферизация в обработчике событий DataReceived требуется, используя ReadLine() вместо ReadExisting(), как правило, простой способ добраться туда. И вместо этого используйте BeginInvoke(), Invoke(), скорее всего, вызовет вызов SerialPort.Close() в тупик.

1

Вам необходимо сбросить цвет в обычный цвет текста RTB:

box.SelectionStart = box.Text.Length; // clear..
box.SelectionLength = 0; // clear     // ..selection
box.SelectionColor = box.ForeColor;   // reset color

Ещё вопросы

Сообщество Overcoder
Наверх
Меню