当我改变一个.NET按钮的背景色恢复到原来的价值,它看起来并不相同更多
题
我有一个按钮,我想“闪”简单地得到用户的关注。我想最简单的方法是将按钮的BackColor
属性更改为另一种颜色,然后再切换回来。所以,我做这样的事情:
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;
和再经过约1/2的第二:
myButton.BackColor = this.oldColor;
但按钮的背景颜色最终会被的明确的比按钮的形式对其余暗!
起初,我以为是因为有什么特别的按钮的原始颜色是命名的颜色(在这种情况下,“控制”),但事实并非如此。
更糟糕的是,当我看着myButton.BackColor
在调试器中,我得到
{Name=Control, ARGB=(255, 236, 233, 216)}
这是完全正确的!但是,当我采取截图,并检查颜色,它是不一样的按钮的休息!
是否有某种遮蔽回事?或许某种抖动的?
解决方案
我想出该问题的原因。原来,有一个名为UseVisualStyleBackColor
另一个属性(按钮和的TabPages只,似乎)。它控制是否要计算BackColor
时,用“视觉样式”。而更糟糕的是,只要你设置BackColor
,它被设置为false
。所以,我刚刚结束了这样做的:
this.oldUseVisualStyleBackColor = myButton.UseVisualStyleBackColor;
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;
而当我准备好将其复位:
myButton.BackColor = this.oldColor;
myButton.UseVisualStyleBackColor = this.oldUseVisualStyleBackColor;
(是,必须首先复位BackColor
,才把设置UseVisualStyleBackColor
。)
我不知道为什么正在使用的UseVisualStyleBackColor
,或者它为什么它做什么,但似乎现在的工作。
(谢谢,马克!我就不会发现这个没有你的帮助!)
其他提示
我怀疑不同的是,一个是有规律的ARGB颜色,而另一个是系统/已知的颜色。
在.NET控制保持跟踪的颜色是否是显式的(该控制集合)或继承。这使得它很难回到正常改变......但你也许可以用PropertyDescriptor
做到这一点,像这样:
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);
}
一个有点笨重,但它应该工作。
按钮的UseVisualStyleBackColor属性确定按钮的背景是否是使用视觉样式绘制。当一个按钮UseVisualStyleBackColor属性设置为True,背景色属性被忽略。当BackColor属性更改为不同的颜色,UseVisualStyleBackColor属性自动设置为False。
当您在设计模式中你可以看到这个效果。创建一个按钮和背景色属性更改为红色。然后向下滚动到UseVisualStyleBackColor财产,并注意它已经被设置为False。如果你那么UseVisualStyleBackColor属性设置为True,按钮颜色将自动变回默认的颜色。切换UseVisualStyleBackColor属性回为False将改变按钮的颜色回到红色。
下面的程序演示这种效果。
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
Button1.BackColor = Color.Red
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
Button1.UseVisualStyleBackColor = Not Button1.UseVisualStyleBackColor
End Sub
由于scraimer张贴他的问题以及识别UseVisualStyleBackColor属性作为有罪culpert。
或者你可以只输入:
TextBox tb = new TextBox();
//Change the Backcolor
tb.BackColor = Color.Red;
//Resets the Backcolor to its default value, its pretty strange that you don't see the method but it works with allmost all properties
tb.ResetBackColor();
简单的方法:
myButton.BackColor = Color.Empty