You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:02:40