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

10

我有一个被设置为只读的TextBox
在某些时候,这个TextBox将可供编辑,并且它的BackColor会改变(用于指示值是否有效)。
如果我想将TexBox重新设置为ReadOnlyTextBox不会返回一个只读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...
}
3个回答

13

您需要将 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;
}

5

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

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

要将一个TextBox设置回系统默认值(不考虑状态):

textBox1.BackColor = Color.Empty;

1
同样地,设置非空的背景颜色也会使自定义的前景色实际显示。 - SimpleVar

3

没问题,你可以使用SystemColors来指定控件所需的颜色。我从未听说过在WinForms中有任何东西会导致控件在设置ReadOnly = true后自动恢复到其默认颜色。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接