[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時的畫面
這是Enabled=false時的畫面
[Code下載]
by sam319