设置只读文本框默认背景颜色

本文关键字:背景 颜色 默认 只读 文本 设置 | 更新日期: 2023-09-27 18:26:25

我有一个TextBox,它被设置为ReadOnly
在某个时刻,TextBox可用于编辑,并且它的BackColor发生更改(它指示该值是否有效)
如果我想将TexBox设置回ReadOnly,则TextBox不会恢复ReadOnly TextBox获得的原始BackColor
我应该怎么做才能重新获得原始颜色
我意识到我可以手动将颜色设置为SystemColors.Control,但这是"正确的方法"吗?

代码示例

这是一个简单的演示代码。如果SystemColors.Control是一条路,我会在ReadOnlyChanged事件中更改它。。。

private void button1_Click(object sender, EventArgs e)
{
    //At this point this.textBox1 is ReadOnly
    this.textBox1.ReadOnly = false;
    this.textBox1.BackColor = Color.Orange;

    /*this.textBox1.BackColor = SystemColors.Control;*/ //Is this the right way?
    this.textBox1.ReadOnly = true; //Textbox remains orange...
}

设置只读文本框默认背景颜色

您必须将BackColor设置为ReadOnly TextBox's BackColor的外观,即Color.FromKnownColor(KnownColor.Control):

//this is the ReadOnlyChanged event handler for your textbox
private void textBox1_ReadOnlyChanged(object sender, EventArgs e){
   if(textBox1.ReadOnly) textBox1.BackColor = Color.FromKnownColor(KnownColor.Control);
}

每次TextBox的BackColor更改时,您可能需要一个变量来存储当前BackColor:

Color currentBackColor;
bool suppressBackColorChanged;
private void textBox1_BackColorChanged(object sender,EventArgs e){
   if(suppressBackColorChanged) return;
   currentBackColor = textBox1.BackColor;
}
private void textBox1_ReadOnlyChanged(object sender, EventArgs e){
   suppressBackColorChanged = true;
   textBox1.BackColor = textBox1.ReadOnly ? Color.FromKnownColor(KnownColor.Control) : currentBackColor;
   suppressBackColorChanged = false;
}

我知道这是一个老问题,但为了子孙后代:

TextBox和许多其他控件都依赖Color.Empty来决定是否显示其默认颜色。

要将TextBox设置回系统默认值(与状态无关):

textBox1.BackColor = Color.Empty;

是的,没关系。没有理由不能使用SystemColors为控件指定所需的颜色。我从来没有听说过WinForms中有任何东西会导致控件在设置ReadOnly = true时自动恢复到默认颜色。

我想一个替代方案是创建一个名为textBox1OriginalColor之类的类级变量,并在表单的Load事件中设置它。如果你认为将来有人可能会在设计器中将文本框的默认背景色设置为蓝色或其他颜色,那么你就可以确切地知道表单最初显示时的颜色。