richtextbox.selectionfont和selectioncolor需基于当前格式增量修改,避免覆盖;插入图片须用dataobject转bitmap粘贴;loadfile/savefile必须指定richtextboxstreamtype.richtext;启用多级撤销需设置enableundo并手动清理撤销栈。

RichTextBox.SelectionFont 和 SelectionColor 怎么用才不覆盖原有格式
直接赋值 SelectionFont 或 SelectionColor 会清空当前选区里已有的字体/颜色设置(比如部分文字加粗、部分变色),导致格式丢失。必须基于当前选中内容的「基础格式」做增量修改。
正确做法是先读取当前选中段落的默认格式,再构造新字体或颜色:
var currentFont = richTextBox1.SelectionFont; richTextBox1.SelectionFont = new Font(currentFont, currentFont.Style | FontStyle.Bold); var currentColor = richTextBox1.SelectionColor; richTextBox1.SelectionColor = Color.Red;
- 只对有选中文本时操作,否则
SelectionFont可能为null,需判空 -
FontStyle.Bold要用按位或|加入,不能直接赋值,否则会丢掉Italic或Underline - 修改
SelectionColor不影响背景色,要改背景用SelectionBackColor
插入图片到 RichTextBox 为什么显示成方块或乱码
RichTextBox 原生只支持嵌入 OLE 对象(如 Word 图片对象)或位图(Bitmap),不识别 PNG/JPEG 流或 Base64 字符串。直接写入二进制或路径字符串只会变成不可见字符或占位方块。
必须用 DataObject 将图片转为 Bitmap 后粘贴:
using (var bmp = new Bitmap(@"C:\icon.png"))
{
Clipboard.SetDataObject(new DataObject(DataFormats.Bitmap, bmp));
richTextBox1.Paste();
}
- 路径必须是本地磁盘上的真实文件,网络 URL 或资源流需先保存为临时
.bmp文件 - PNG 透明通道在 RichTextBox 中会丢失(显示为灰白底),建议预处理为带背景的 BMP
- 插入后图片尺寸固定,无法缩放;若需等比缩放,得先用
Bitmap.GetThumbnailImage()缩小再插入
RichTextBox.LoadFile 和 SaveFile 为什么读写 RTF 失败或乱码
常见错误是没指定 RichTextBoxStreamType.RichText,误用 PlainText 导致格式全丢,或用 UTF8 编码保存 RTF 文件引发解析异常。
- 加载 RTF 文件:必须用
richTextBox1.LoadFile("a.rtf", RichTextBoxStreamType.RichText),不能省略第二个参数 - 保存 RTF 文件:同样指定
RichTextBoxStreamType.RichText,且路径不能含中文或特殊符号(某些 .NET Framework 版本会崩溃) - RTF 内容含非 ASCII 字符(如中文)时,
SaveFile默认用系统 ANSI 编码,可能被误读;稳妥做法是用File.WriteAllText手动写入 UTF-8 + BOM 的 RTF 字符串(需先调用RichTextBox.Rtf属性获取字符串)
怎么让 RichTextBox 支持 Ctrl+Z 多级撤销但又不崩
默认 RichTextBox 的撤销栈深度只有 100 步,且在频繁插入图片或大段文本时容易卡死或抛 OutOfMemoryException。
- 启用完整撤销功能:设置
richTextBox1.EnableUndo = true(WinForms 默认为true,但某些设计器可能关掉) - 增大撤销步数:通过反射修改内部字段(.NET Framework 可行,.NET Core/5+ 不支持):
typeof(RichTextBox).GetField("undoLimit", BindingFlags.NonPublic | BindingFlags.Instance).SetValue(richTextBox1, 500); - 插入图片或大对象前手动
richTextBox1.ClearUndo(),避免撤销栈膨胀——这是最容易被忽略的性能点
图片和复杂格式会让撤销数据体积指数增长,不是加内存就能解决的问题。











