RichTextBox赋值不显示因Text与Rtf属性互斥:设过Rtf后Text变为只读视图,修改无效;纯文本操作Text并清空Rtf,富文本则统一用Rtf且确保头部为{ tf1nsideff0}。

RichTextBox内容赋值后不显示?检查Text和Rtf属性混用
直接给Text赋值却看不到效果,大概率是之前设过Rtf——一旦Rtf非空,Text就变成只读视图,改它不会刷新显示。反过来也一样:Rtf会覆盖Text的修改。
- 只用纯文本:始终操作
Text,确保Rtf为空(可设为string.Empty) - 需要格式(加粗/颜色/换行):统一走
Rtf,别掺Text;生成RTF字符串时注意头部必须带{ tf1nsideff0},否则解析失败 - 调试技巧:打断点看
richTextBox1.Rtf.Length和richTextBox1.Text.Length是否预期一致
SelectionStart/SelectionLength失效?焦点和只读状态干扰
代码里调了SelectionStart = 10,光标没动——常见于控件没获得焦点,或ReadOnly为true时仍尝试选中。
- 必须先调
Focus()再设SelectionStart,WinForms里焦点切换有延迟,可加Application.DoEvents()(仅调试用) -
ReadOnly = true时SelectionStart可读不可写,但Select()方法仍能触发选中(视觉上可见高亮),只是不能编辑 - 批量操作前建议缓存原状态:
var wasReadOnly = richTextBox1.ReadOnly; richTextBox1.ReadOnly = false;,完事再还原
AppendText性能崩了?避免在循环里反复触发重绘
逐行AppendText几千次,界面卡死甚至假死——每次调用都触发布局计算和重绘,不是字符串拼接慢,是渲染开销爆炸。
- 高频追加场景:先用
StringBuilder拼好完整文本,最后一次性赋给Text或Rtf - 真要实时追加(如日志):用
SuspendLayout()+ResumeLayout(false)包住循环体,抑制中间重绘 - 注意
AppendText本身不换行,想换行得手动加" ";若用Rtf追加,还得补RTF换行控制符\par
中文乱码或字体异常?RTF编码和字体回退机制
粘贴进来的中文显示方块,或者指定Font后部分字符变成默认宋体——RTF对中文字体声明敏感,且Windows会按charset查字体表,找不到就降级。
- 生成RTF时强制声明中文字体:
{onttbl{0nilcharset134 SimSun;}}(134=GB2312),并在文本前加0 - 运行时动态改字体:别只改
Font属性,要同步更新SelectionFont,否则新输入才生效,已有文本不变 - 兼容性坑:.NET Core/.NET 5+ 的
RichTextBox在Linux/macOS不可用,Windows下也依赖GDI+,WSL GUI环境可能渲染异常
RTF格式本身脆弱,少手动拼接,多用SelectedRtf读写局部内容;真正复杂的排版需求,早该换WebView2或第三方富文本控件了。











