Windows Forms中RichTextBox首次显示后设置ReadOnly属性部分失效
Windows Forms RichTextBox ReadOnly 切换时背景色不更新的解决方法
针对RichTextBox在运行时切换ReadOnly属性后背景色未同步更新的问题,提供以下几种可行的解决思路:
方法一:手动指定对应状态的背景色
既然调试时已确认BackColor属性已变化但未显示,可直接手动设置系统默认的只读/可编辑状态背景色,强制控件更新视觉表现:
private void BnDoSth_Click(object sender, EventArgs e) { tbDoc.ReadOnly = !tbDoc.ReadOnly; // 根据只读状态设置对应系统颜色 tbDoc.BackColor = tbDoc.ReadOnly ? SystemColors.Control : SystemColors.Window; }
方法二:强制控件更新样式
通过反射调用Control类的私有UpdateStyles方法,触发控件样式的重新计算与应用:
using System.Reflection; private void BnDoSth_Click(object sender, EventArgs e) { tbDoc.ReadOnly = !tbDoc.ReadOnly; // 调用私有方法更新样式 var updateStylesMethod = typeof(Control).GetMethod("UpdateStyles", BindingFlags.Instance | BindingFlags.NonPublic); updateStylesMethod?.Invoke(tbDoc, null); }
方法三:重建控件句柄(需注意状态保存)
重建RichTextBox的句柄可强制控件重新渲染,需提前保存文本和选区状态避免丢失:
private void BnDoSth_Click(object sender, EventArgs e) { // 保存当前文本和选区信息 var currentText = tbDoc.Text; var selectionStart = tbDoc.SelectionStart; var selectionLength = tbDoc.SelectionLength; tbDoc.ReadOnly = !tbDoc.ReadOnly; tbDoc.RecreateHandle(); // 重建句柄触发重绘 // 恢复文本和选区 tbDoc.Text = currentText; tbDoc.SelectionStart = selectionStart; tbDoc.SelectionLength = selectionLength; }
这些方法都无需重新创建整个控件,可有效解决背景色不同步的问题。
内容的提问来源于stack exchange,提问作者TomB
相关产品推荐
相关产品推荐

