设置只读文本框默认Backcolor

我有一个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; } 

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

我想一个替代方法是创建一个名为textBox1OriginalColor的类级变量,并在表单的Load事件中设置它。 然后你就知道表单最初显示时到底是什么,如果你认为某个人将来可能会将文本框的默认背景颜色设置为设计器中的蓝色等等。