.NET RichTextBox: невозможно изменить свойство Rtf

Возможно, мне здесь не хватает чего-то очень простого, но я изо всех сил пытался изменить свойство RTF моего RichTextBox, чтобы применить цветовую кодировку к моему тексту. Вероятно, самый простой пример проблемы, с которой я столкнулся, - это установка свойства Rtf для включения таблицы цветов в его заголовок.

Строка RTF по умолчанию, возвращаемая свойством Rtf:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}\viewkind4\uc1\pard\f0\fs17\par}

И новую строку RTF, которую я хотел бы установить с моей таблицей цветов:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}{\colortbl;\red128\green0\blue0;\red0\green128\blue0;\red0\green0\blue255;}}\viewkind4\uc1\pard\f0\fs17\par}

И я установил это, используя:

RichTextBox richTextBox = new RichTextBox();
richTextBox.Rtf = rtfStr; // My new RTF string, as seen above.

Однако через отладчик можно заметить, что свойство Rtf упорно отказывается изменяться; никаких исключений не выбрасывается, просто отказывается меняться. Та же проблема возникает, когда я вставляю слова String.Replace (), чтобы включить вокруг них цветные теги RTF. Я также попытался отключить какие-либо свойства ReadOnly в текстовом поле.

Любые предложения были бы очень полезны, спасибо!

  • Дэйв

person Dave    schedule 10.06.2010    source источник


Ответы (2)


Почему бы не использовать встроенную функцию изменения цвета?

    rtbPreview.SelectionStart = 1;
    rtbPreview.SelectionLength = 3;
    rtbPreview.SelectionFont = newFont;
    rtbPreview.SelectionColor = Color.Red;

Или, если вам действительно нужно повозиться с форматом RTF, установите цвет программно, затем посмотрите, какой RTF он генерирует, и попробуйте. Может формат неправильный, поэтому он молча подавляет ошибку.

Изменить: Кроме того, я надеюсь, что вы на самом деле не создаете новый RTB каждый раз. Если да, то из вашего образца видно, что вы не добавляете его в коллекцию элементов управления, и в этом случае он никогда не будет виден.

person Jeremy    schedule 10.06.2010
comment
Что ж, я определенно вижу то, что вы видите. Похоже, что элемент управления RichTextBox пытается исправить ваш RTF, добавляя и удаляя элементы, которые он считает нужными. Когда я устанавливаю цвет, как указано выше, беру этот RTF и вставляю его обратно, все в порядке. Если я скармливаю ему что-то немного другое, он удаляет мою таблицу цветов. Если я не дам ему текста, он также удалит таблицу цветов, предположительно из-за того, что нет текста для раскраски. - person Jeremy; 11.06.2010
comment
Очень интересно. Я заметил какое-то самокорректирующееся поведение с точки зрения свойства RTF. Я также проверил неверный формат, теорию тихой коррекции, предоставив ей явно плохую строку RTF, которую она немедленно отклоняет с помощью исключения ArgumentException. Чтобы решить вашу проблему, мой RTB является частью Windows Form, поэтому он не воссоздается, а фактически отображается. - person Dave; 11.06.2010

Как упоминал Джереми, RichTextBox в .NET автоматически переформатирует ваши RTF-данные, чтобы упростить и стандартизировать их после того, как вы присвоите свойству .Rtf. Когда вы добавляете свою цветовую таблицу, дело не в том, что RichTextBox отказывается изменяться, а в том, что вы фактически не используете ни один из этих цветов, поэтому они снова упрощаются. Пока вы добавляете цветной текст для использования каждого нового цветового кода, RichTextBox сохранит ваши настраиваемые цвета.

Следовательно, если вы не хотите использовать простые свойства, упомянутые Джереми, вам нужно будет отслеживать, какие цвета вы уже добавили в цветовую таблицу и каковы их индексы. Если элемент управления доступен для редактирования пользователем, вам, кроме того, потребуется возможность анализировать текущую таблицу цветов, поскольку пользователь может удалить весь текст данного цвета и вызвать удаление цвета из таблицы цветов (вероятно, вызывая перенумерацию индекса цвета).

Вот статья о CodeProject, которая охватывает некоторые основы, но не добавляет таблицу цветов в нужное место и не занимается повторным анализом таблицы цветов: http://www.codeproject.com/KB/cs/RTFSyntaxColour.aspx

person PolyTekPatrick    schedule 20.02.2011