.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 цветни тагове около тях. Също така се опитах да изключа свойствата само за четене в текстовото поле.

Всякакви предложения биха били много полезни, благодаря!

  • Дейв

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 ще запази вашата персонализирана цветова таблица.

Следователно, ако не искате да използвате простите свойства, които Jeremy спомена, ще трябва да следите кои цветове вече сте добавили към таблицата с цветове и какви са техните индекси. Ако контролата може да се редактира от потребителя, вие освен това ще имате нужда от способността да анализирате текущата цветна таблица, тъй като потребителят може да изтрие целия текст в даден цвят и да причини премахването на цвят от цветната таблица (вероятно причинявайки преномериране на цветовия индекс).

Ето една статия за CodeProject, която обхваща някои от основите, но не добавя цветовата таблица на точното място, нито пък се занимава с повторно анализиране на цветовата таблица: http://www.codeproject.com/KB/cs/RTFSyntaxColour.aspx

person PolyTekPatrick    schedule 20.02.2011