【问题标题】:Setting a ReadOnly TextBox default BackColor设置 ReadOnly TextBox 默认 BackColor
【发布时间】:2013-08-05 01:58:23
【问题描述】:

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

【问题讨论】:

    标签: c# winforms colors textbox


    【解决方案1】:

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

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

    将 TextBox 设置回系统默认值(无论状态如何):

    textBox1.BackColor = Color.Empty;
    

    【讨论】:

    • 同理,设置非空背景色也会使自定义的前色实际显示出来。
    【解决方案2】:

    您必须将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 事件中。然后,如果您认为将来有人可能将文本框的默认背景颜色设置为,例如,设计器中的蓝色或其他什么,那么您就可以确切地知道最初显示表单时它是什么。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-09-05
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 2014-12-01
        • 1970-01-01
        • 2015-09-05
        相关资源
        最近更新 更多