'How to avoid color changes when button is disabled?
We have a Windows Forms project with quite a few FlatStyle buttons.
When we disable the buttons, the colors of the buttons are changed automatically Frown | :(
Is it possible to override this somehow, so we can control the colors ourselves?
Solution 1:[1]
You need to use the EnabledChanged event to set the desired color. Here is an example.
private void Button1_EnabledChanged(object sender, System.EventArgs e)
{
Button1.ForeColor = sender.enabled == false ? Color.Blue : Color.Red;
Button1.BackColor = Color.AliceBlue;
}
Use the desired colors according to your requirement.
Also you need to use the paint event.
private void Button1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
dynamic btn = (Button)sender;
dynamic drawBrush = new SolidBrush(btn.ForeColor);
dynamic sf = new StringFormat {
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center };
Button1.Text = string.Empty;
e.Graphics.DrawString("Button1", btn.Font, drawBrush, e.ClipRectangle, sf);
drawBrush.Dispose();
sf.Dispose();
}
Solution 2:[2]
To get less-fuzzy text, use the TextRenderer class instead:
private void Button1_Paint(object sender, PaintEventArgs e)
{
Button btn = (Button)sender;
// make sure Text is not also written on button
btn.Text = string.Empty;
// set flags to center text on button
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak; // center the text
// render the text onto the button
TextRenderer.DrawText(e.Graphics, "Hello", btn.Font, e.ClipRectangle, btn.ForeColor, flags);
}
And the Button1_EnabledChanged method as in Harsh's answer.
Solution 3:[3]
I use ClientRectangle instead of e.ClipRectangle to avoid clip effect when the button is partialy repaint :
e.Graphics.Clear(BackColor);
using (var drawBrush = new SolidBrush(ForeColor))
using (var sf = new StringFormat
{
Alignment = StringAlignment.Center,
LineAlignment = StringAlignment.Center
})
{
e.Graphics.DrawString(Text, Font, drawBrush, ClientRectangle, sf);
}
Solution 4:[4]
On the EnableChanged event of the button
private void button1_EnabledChanged(object sender, EventArgs e)
{
if (button1.Enabled == false)
{
button1.ForeColor = Color.DarkGray; //or pick the color you want when not enabled
}
else
{
button1.ForeColor = Color.White; //same here with the color
}
}
Solution 5:[5]
I followed the following approach :- The Click() event of the button can be controlled using custom variable.
private bool btnDisabled;
private void btnClick(object sender, EventArgs e){
if(!btnDisabled) return;}
This way the button doesn't even need to be disabled. The button still has the click feel but no action will be taken. Have to use the right colors to communicate that the button is disabled.
Solution 6:[6]
Another way to do this is to use the Pre_Render event. The example use Telerik but standard buttons should work fine too.
protected void radButton_PreRender(object sender, EventArgs e)
{
RadButton btn = sender as RadButton;
btn.BackColor = btn.Checked ? Color.LightBlue : Color.White;
}
Solution 7:[7]
Never too late for a suggestion:
public class BlackButton : Button
{
#region #Private Members
private bool m_BasePaint = false;
#endregion #Private Members
#region #Ctor
public BlackButton() : base()
{
base.ForeColor = Color.White;
base.BackColor = Color.Black;
this.DisabledForeColor = Color.FromArgb(0x6D, 0x6D, 0x6D);
}
#endregion #Ctor
#region #Public Interface
public Color DisabledForeColor
{
get;
set;
}
#endregion #Public Interface
#region #Overrides
public override string Text
{
get
{
if (m_BasePaint)
return "";
return base.Text;
}
set
{
base.Text = value;
}
}
protected override void OnPaint(PaintEventArgs pevent)
{
m_BasePaint = true;
base.OnPaint(pevent);
m_BasePaint = false;
TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.VerticalCenter | TextFormatFlags.WordBreak;
TextRenderer.DrawText(pevent.Graphics,
Text,
base.Font,
ClientRectangle,
base.Enabled ? base.ForeColor : this.DisabledForeColor,
flags);
}
#endregion #Overrides
}
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | |
Solution 2 | radiata1891 |
Solution 3 | Mathieu Cans |
Solution 4 | Estefania Hernandez |
Solution 5 | |
Solution 6 | Gordon Brown |
Solution 7 |