C# 设置只读文本框默认背景色
我有一个C# 设置只读文本框默认背景色,c#,winforms,colors,textbox,C#,Winforms,Colors,Textbox,我有一个文本框,设置为只读 在某个点上,TextBox可供编辑,并且它的背景色发生变化(它指示该值是否有效)。 如果我想将TexBox设置回ReadOnly,则TextBox不会返回ReadOnlyTextBox获得的原始背景色。 我应该怎么做才能重新获得原始颜色? 我意识到我可以手动将颜色设置为SystemColors.Control,但这是“正确的方法”吗 代码示例 这是一个简单的演示代码。 如果SystemColors.Control是一种方法,我将在ReadOnlyChanged事件中更
文本框
,设置为只读
在某个点上,
TextBox
可供编辑,并且它的背景色
发生变化(它指示该值是否有效)。如果我想将
TexBox
设置回ReadOnly
,则TextBox
不会返回ReadOnly
TextBox
获得的原始背景色。
我应该怎么做才能重新获得原始颜色?
我意识到我可以手动将颜色设置为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...
}
是的,很好。没有理由不能使用SystemColor为控件指定所需的颜色。我从未听说过在WinForms
中有任何东西会导致控件在设置ReadOnly=true
时自动恢复为默认颜色
我认为一种替代方法是创建一个名为textBox1OriginalColor
的类级变量,并在表单的Load
事件中设置它。如果您认为将来有人可能会在设计器中将文本框的默认背景色设置为蓝色或其他颜色,那么您就可以确切地知道表单最初显示时是什么颜色。您必须将背景色设置为只读文本框的背景色
,即颜色(知道颜色控制)
:
每次文本框的背景色更改时,您可能需要一个变量来存储当前背景色:
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和许多其他控件都依赖于颜色。Empty决定是否显示其默认颜色
要将文本框设置回系统默认值(不考虑状态):
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;
}
textBox1.BackColor = Color.Empty;