Когда я меняюсь ... a.NET кнопка BackColor возвращается к исходному значению, она больше не выглядит так же

у меня есть кнопка, которую я хотел "мигать", чтобы привлечь внимание пользователя. Я решил, что самый простой способ-изменить 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)}

что совершенно правильно! Но когда я делаю скриншот и проверяю цвет, он не такой, как остальные кнопки!

происходит ли какая-то маскировка? Или, может быть, какое-то колебание?

5 ответов


я выяснил причину проблемы. Оказывается, есть еще одно свойство (только для кнопок и вкладок, кажется) с именем 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 используется или почему он делает то, что он делает, но теперь он работает.

(Спасибо, Марк! Я бы не нашел это без твоей помощи!)


Я подозреваю, что разница в том, что один-обычный цвет 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 игнорируется. При изменении свойства 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 как виновным 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