2010-06-10 42 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