[C#] 如何在TextBox.Enabled=false時, 自訂字體顏色

[C#] 如何在TextBox.Enabled=false時, 自訂字體顏色

操作環境: ,


通常設定TextBox.Enabled=false時
系統會自動的幫我們把顏色改成灰底灰字
但user反應這樣的顏色搭配看了很吃力
希望至少可以呈現灰底字出來
但偏偏TextBox.Enabled=false時
就是不能改變字體顏色 (但背景顏色是可以改變的)


之前為了解決這個問題
在網路上翻遍了大小文章
幾乎都是教你怎麼重寫一個TextBox
並覆載它的OnPaint方法


但覆載OnPaint方法要考慮的東西非常多
字體大小/位置/對齊方式/密碼遮罩/多行.....
稍有考慮不周詳的地方
表現出來的TextBox就會變的很詭異


如果不覆載OnPaint方法那該怎麼做?


其實TextBox還有一個ReadOnly屬性
當TextBox.ReadOnly=true時字體顏色仍然是可以改變的
我們利用這個特性來重寫一個TextBox
當設定Enabled屬性時
改變的其實是ReadOnly值

public partial class uTextBox : TextBox
{
    public new bool Enabled //這邊重寫Enabled屬性, 使用關鍵字new把原本的Enabled屬性隱藏起來
    {
        get { return !ReadOnly; }
        set { ReadOnly = !value; } //Enabled和ReadOnly是互斥的
    }
}

 

然後重載OnReadOnlyChanged方法
在這邊改變字體和背景顏色

protected override void OnReadOnlyChanged(EventArgs e)
{
    base.OnReadOnlyChanged(e);
 
    if (ReadOnly)
    {
        base.BackColor = disableBackColor;
        base.ForeColor = disableForeColor;
    }
    else
    {
        base.BackColor = backColor;
        base.ForeColor = foreColor;
    }
}

 

以下是屬性設定
主要是儲存Enabled=true和false時的字體和背景顏色

   1: private Color backColor = Color.FromKnownColor(KnownColor.Window); //Enable的背景顏色
   2: public new Color BackColor
   3: {
   4:     get { return backColor; }
   5:     set
   6:     {
   7:         backColor = value;
   8:         base.BackColor = value;
   9:     }
  10: }
  11:  
  12: private Color foreColor = Color.FromKnownColor(KnownColor.WindowText); //Enable的字體顏色
  13: public new Color ForeColor
  14: {
  15:     get { return foreColor; }
  16:     set
  17:     {
  18:         foreColor = value;
  19:         base.ForeColor = value;
  20:     }
  21: }
  22:  
  23: private Color disableBackColor = Color.FromArgb(240, 240, 240); //Disable的背景顏色
  24: public Color DisableBackColor
  25: {
  26:     get { return disableBackColor; }
  27:     set { disableBackColor = value; }
  28: }
  29:  
  30: private Color disableForeColor = Color.FromKnownColor(KnownColor.WindowText); //Disable的字體顏色
  31: public Color DisableForeColor
  32: {
  33:     get { return disableForeColor; }
  34:     set { disableForeColor = value; }
  35: }

 

我們來測試一下
這是TextBox.Enabled=true時的畫面

image


這是Enabled=false時的畫面

image

 

[Code下載]

 

 

by sam319