Quando eu mudar BackColor costas de um botão .NET para o seu valor original, ele não parece mais o mesmo
Pergunta
Eu tenho um botão que eu queria brevemente "Flash" para chamar a atenção do usuário. Imaginei que a maneira mais fácil seria para alterar a propriedade BackColor
do botão para uma outra cor, e depois ligá-lo de volta. Então eu fazer algo parecido com isto:
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;
e, em seguida, depois de uma cerca de 1/2 de um segundo:
myButton.BackColor = this.oldColor;
Mas end cor de fundo do botão por ser distintamente mais escura do que o resto dos botões no formulário!
No início, eu pensei que era porque há algo especial sobre a cor original do botão sendo uma cor chamada (neste caso, "Control"), mas não é.
O que é pior, quando eu olhar para myButton.BackColor
no depurador, recebo
{Name=Control, ARGB=(255, 236, 233, 216)}
Qual é exatamente correto! Mas quando eu tirar um screenshot, e verificar a cor, não é o mesmo que o resto dos botões!
Existe algum tipo de mascarar acontecendo? Ou talvez algum tipo de hesitação?
Solução
Eu descobri a causa do problema. Acontece que há uma outra propriedade (para botões e TabPages somente, ao que parece) nomeados UseVisualStyleBackColor
. Ele controla se deve ou não utilizar "Visual Styles" no cálculo do BackColor
. E para piorar a situação, assim que definir a BackColor
, ele é definido como false
. Então, eu só acabou fazendo o seguinte:
this.oldUseVisualStyleBackColor = myButton.UseVisualStyleBackColor;
this.oldColor = myButton.BackColor;
myButton.BackColor = Color.Blue;
E quando eu estou pronto para redefini-la:
myButton.BackColor = this.oldColor;
myButton.UseVisualStyleBackColor = this.oldUseVisualStyleBackColor;
(Sim, você tem que repor o BackColor
primeiro, e só então UseVisualStyleBackColor
set.)
Eu não tenho idéia por que o UseVisualStyleBackColor
está sendo usado, ou por que ele faz o que faz, mas parece funcionar agora.
(Obrigado, Marc! Eu não encontrei isso sem sua ajuda!)
Outras dicas
Eu suspeito que a diferença é que um é uma cor normal ARGB, e um é um sistema / cor conhecida.
controles no .NET faixa de manter se a cor é explícito (definidos nesta controle) ou hereditárias. Isso torna difícil para voltar corretamente ... mas você pode ser capaz de fazê-lo com PropertyDescriptor
, assim:
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);
}
Um pouco desajeitado, mas ele deve funcionar.
A propriedade UseVisualStyleBackColor de botão determina se o plano de fundo do botão é desenhado com estilos visuais. Quando a propriedade UseVisualStyleBackColor de um botão é definida como True, a propriedade BackColor é ignorada. Quando a propriedade BackColor é alterado para uma cor diferente, a propriedade UseVisualStyleBackColor é automaticamente definida para Falso.
Você pode ver este efeito quando você está em modo de design. Criar um botão e altere a propriedade BackColor para vermelho. Em seguida, desloque-se para a propriedade UseVisualStyleBackColor, e nota que foi definida para Falso. Se você, em seguida, definir a propriedade UseVisualStyleBackColor como True, a cor do botão será alterado novamente para a cor padrão. Alternando a propriedade UseVisualStyleBackColor volta para Falso vai mudar a parte traseira cor do botão para vermelho.
O programa a seguir demonstra esse efeito.
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
Graças à scraimer para postar o seu problema e identificar a propriedade UseVisualStyleBackColor como o culpert culpado.
Ou você poderia simplesmente digitar:
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();
Maneira simples:
myButton.BackColor = Color.Empty