当我改变一个.NET按钮的背景色恢复到原来的价值,它看起来并不相同更多

StackOverflow https://stackoverflow.com/questions/506641

  •  21-08-2019
  •  | 
  •  

我有一个按钮,我想“闪”简单地得到用户的关注。我想最简单的方法是将按钮的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
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top