10

我有一个按钮,我想简单地“闪烁”以引起用户的注意。我认为最简单的方法是将 Button 的BackColor属性更改为另一种颜色,然后再将其切换回来。所以我做这样的事情:

this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;

然后大约 1/2 秒后:

myButton.BackColor = this.oldColor;

但是按钮的背景颜色最终明显比表单上的其他按钮更暗!

起初,我认为这是因为按钮的原始颜色是命名颜色(在本例中为“Control”)有一些特别之处,但事实并非如此。

更糟糕的是,当我myButton.BackColor在调试器中查看时,我得到了

{Name=Control, ARGB=(255, 236, 233, 216)}

这是完全正确的!但是当我截屏并检查颜色时,它与其余按钮不一样!

是否有某种掩蔽发生?或者也许是某种抖动?

4

5 回答 5

14

我找出了问题的原因。原来还有另一个名为UseVisualStyleBackColor. 它控制在计算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要使用它,或者它为什么会这样做,但它现在似乎可以工作了。

(谢谢,马克!没有你的帮助,我不会找到这个!)

于 2009-02-03T11:24:18.933 回答
3

我怀疑区别在于一个是常规的 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);
    }

有点笨拙,但它应该工作。

于 2009-02-03T10:30:41.647 回答
3

按钮的 UseVisualStyleBackColor 属性确定按钮的背景是否使用视觉样式绘制。当按钮的 UseVisualStyleBackColor 属性设置为 True 时,BackColor 属性将被忽略。当 BackColor 属性更改为不同的颜色时,UseVisualStyleBackColor 属性会自动设置为 False。

当您处于设计模式时,您可以看到这种效果。创建一个按钮并将 BackColor 属性更改为红色。然后向下滚动到 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 属性识别为有罪的罪魁祸首。

于 2013-04-12T17:06:21.663 回答
2

或者你可以输入:

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();
于 2010-03-09T10:24:45.887 回答
0

简单的方法:

myButton.BackColor = Color.Empty
于 2012-03-01T22:51:04.530 回答