2010-06-10 81 views
1

也許我錯過了一些真正簡單的事情,但我一直在努力改變RichTextBox的RTF屬性,以便將一些顏色編碼應用於我的文本。可能是我遇到的問題最直接的例子是將Rtf屬性設置爲在其標題中包含顏色表。.NET 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屬性固執地拒絕ch安格;沒有例外,它只是拒絕改變。當我string.Replace()單詞在它們周圍包含RTF顏色標籤時,會發生同樣的問題。我也嘗試關閉文本框中的任何ReadOnly屬性。

任何建議將是最有幫助的,謝謝!

  • 戴夫

回答

0

爲什麼不使用內置的功能來改變顏色?

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

或者,如果你真的需要惹RTF格式,設置顏色編程,然後看看它會產生什麼RTF,並給一個嘗試。也許格式不正確,因此它正在悄悄地壓制一個錯誤。

編輯: 另外,我希望你實際上並不是每次都創建一個新的RTB。如果你是,從你的例子看,你並沒有將它添加到控件集合中,在這種情況下,它永遠不會被看到。

+0

好吧,我確實看到了什麼你看到了。它看起來像RichTextBox控件試圖通過添加東西並刪除它認爲合適的東西來「修復」你的RTF。當我按照上面的方式設置顏色時,拿起那個RTF,然後重新插入,這很好。如果我餵它有點不同,它會刪除我的顏色表。如果我給它沒有文字,它似乎也刪除顏色表,大概是因爲沒有文字要着色。 – Jeremy 2010-06-10 20:51:19

+0

非常有趣。我注意到RTF屬性的某種「自我糾正」行爲。我也通過給它一個明顯不好的RTF字符串來檢查「壞格式,無聲校正」理論,它立即拒絕一個ArgumentException。 爲了解決您的問題,我的RTB是Windows窗體的一部分,因此它不會被重新創建,並且實際上正在顯示。 – Dave 2010-06-11 14:36:50

0

正如Jeremy所提到的,.NET中的RichTextBox將自動重新格式化您的RTF數據,以便在分配給.Rtf屬性後簡化和標準化它。當你添加你的顏色表時,並不是說RichTextBox拒絕改變,而是你實際上並沒有使用任何這些顏色,所以它們被簡化了。只要您添加一些彩色文本以使用每個新的顏色代碼,RichTextBox就會保持您的自定義colortable。因此,如果您不想使用Jeremy提到的簡單屬性,則需要跟蹤已添加到顏色表中的哪些顏色以及它們的索引是什麼。如果用戶可以編輯控件,則還需要能夠解析出當前顏色表,因爲用戶可以刪除給定顏色中的所有文本,並從顏色表中刪除顏色(可能導致顏色索引重新編號)。

下面是在CodeProject上的文章,介紹了一些基本知識,但不將顏色表添加到比較合適的地方,也沒有處理重新分析顏色表:http://www.codeproject.com/KB/cs/RTFSyntaxColour.aspx