Да, я думаю, что вы правы: свойство Foreground
относится ко всему тексту в RichTextBox
, а не к отдельным элементам.
Я могу предложить решение вашего вопроса, но потерпите меня ...
Собирать сообщения индивидуально
Когда я говорю «сообщение», я имею в виду все, что передается OKDataReceived
и ErrorDataReceived
.
В вашей архитектуре есть проблема, заключающаяся в том, что вы не различаете «хорошие» сообщения и «плохие» сообщения от вашего процесса. OutputStream
содержит оба, и когда MessageColor
изменится, он изменится для всех предыдущих сообщений, а не только для самого последнего.
Я бы предложил изменить класс Message
с текстом сообщения и флажком, будь то "хорошее" или "плохое" сообщение. Когда вы получаете новые данные из процесса, вы создаете Message
и устанавливаете флаг «хорошо» или «плохо» соответственно.
Затем замените OutputStream
свойством типа ObservableCollection<Message>
. После создания нового Message
из процесса вы можете добавить его к этому ObservableCollection<Message>
. Это свойство, которое в конечном итоге будет привязано к вашему мнению. Обратите внимание, что когда новый элемент добавляется в ObservableCollection
, он автоматически обновляет привязку.
Теперь я не забыл ваш первоначальный вопрос о том, как отображать текст в представлении разными цветами. Я могу дать вам совет, но это зависит от наличия ObservableCollection<Message>
в модели.
Преобразование сообщений в FlowDocument
Свяжите ObservableCollection<Message>
с элементом управления RichTextBox
, но используйте IValueConverter
для преобразования всех Messages
в FlowDocument
. Каждое сообщение будет преобразовано в Paragraph
с Run
, который будет содержать текст. Затем вы должны установить для свойства Foreground
в абзаце правильный цвет для флага в Message
. Вам также необходимо привязать свойство к свойству RichTextBox.Document
. В статье MSDN для RichTextBox
есть небольшой пример, который, я думаю, вы сможете оттуда выяснить.
Основным недостатком этого подхода является то, что всякий раз, когда процесс выдает новое сообщение, ему потребуется снова преобразовать ObservableCollection
в FlowDocument
, а не только в новый элемент. Но я думаю, что влияние на производительность будет минимальным.
Я думаю, что это был бы лучший подход. В конце у вас будет модель представления с различимыми сообщениями, конвертер, который может быть изменен при необходимости, и только несколько изменений в самом представлении.