Quando eu mudar BackColor costas de um botão .NET para o seu valor original, ele não parece mais o mesmo

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

  •  21-08-2019
  •  | 
  •  

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?

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top