设置ReadOnly TextBox默认BackColor

问题描述 投票:9回答:3

我有一个TextBox,它设置为ReadOnly。在某些时候TextBox可用于编辑,并且BackColor更改(指示该值是否有效)。如果我想将TexBox设置回ReadOnly,则TextBox不会找回BackColor 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...
}
c# winforms colors textbox
3个回答
12
投票

您必须将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;
}

3
投票

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

我想一种替代方法是创建一个名为textBox1OriginalColor或类似名称的类级变量,并将其设置在表单的Load事件中。然后,如果您认为将来有人可能将文本框的默认背景色设置为设计器中的蓝色等,则可以确切地知道最初显示该窗体时的状态。


2
投票

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

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

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

textBox1.BackColor = Color.Empty;
© www.soinside.com 2019 - 2024. All rights reserved.