I have a button which I wanted to "flash" briefly to get the user's attention. I figured the easiest way would be to change the Button's BackColor
property to another color, and then switch it back again. So I do something like this:
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;
and then after a about 1/2 a second:
myButton.BackColor = this.oldColor;
But the button's background color end up being distinctly darker than the rest of the buttons on the Form!
At first, I thought it was because there's something special about the button's original color being a named color (in this case, "Control") but it isn't.
What's worse, when I look at myButton.BackColor
in the debugger, I get
{Name=Control, ARGB=(255, 236, 233, 216)}
Which is exactly correct! But when I take a screenshot, and check the color, it isn't the same as the rest of the buttons!
Is there some kind of masking going on? Or perhaps some kind of dithering?
I figured out the cause for the problem. Turns out there's another property (for Buttons and TabPages only, it seems) named UseVisualStyleBackColor
. It controls whether or not to use "Visual Styles" when calculating the BackColor
. And to make matters worse, as soon as you set the BackColor
, it's set to false
. So I just ended up doing this:
this.oldUseVisualStyleBackColor = myButton.UseVisualStyleBackColor;
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;
And when I'm ready to reset it:
myButton.BackColor = this.oldColor;
myButton.UseVisualStyleBackColor = this.oldUseVisualStyleBackColor;
(Yes, you have to reset the BackColor
first, and only then set UseVisualStyleBackColor
.)
I have no idea why the UseVisualStyleBackColor
is being used, or why it does what it does, but it seems to work now.
(Thanks, Marc! I wouldn't have found this without your help!)
I suspect the difference is that one is a regular argb color, and one is a system/known color.
Controls in .NET keep track of whether the color is explicit (set on this control) or inherited. This makes it hard to change back properly... but you might be able to do it with PropertyDescriptor
, like so:
TextBox tb = new TextBox();
tb.BackColor = Color.Red;
// now set it back to inherited
PropertyDescriptor prop = TypeDescriptor.GetProperties(tb)["BackColor"];
if (prop.CanResetValue(tb))
{
prop.ResetValue(tb);
}
A bit clunky, but it should work.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With