Когда я возвращаю исходное значение BackColor кнопки .NET обратно к исходному значению, он больше не выглядит одинаково - PullRequest
9 голосов
/ 03 февраля 2009

У меня есть кнопка, которую я хотел кратковременно «мигать», чтобы привлечь внимание пользователя. Я подумал, что проще всего было бы изменить свойство Button BackColor на другой цвет, а затем снова переключить его. Поэтому я делаю что-то вроде этого:

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

и затем примерно через 1/2 секунды:

myButton.BackColor = this.oldColor;

Но цвет фона кнопки в итоге становится отчетливо темнее, чем остальные кнопки в форме!

Сначала я подумал, что это потому, что есть что-то особенное в том, что оригинальный цвет кнопки - это именованный цвет (в данном случае «Контроль»), но это не так.

Что еще хуже, когда я смотрю на myButton.BackColor в отладчике, я получаю

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

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

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

Ответы [ 5 ]

13 голосов
/ 03 февраля 2009

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

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

3 голосов
/ 12 апреля 2013

Свойство кнопки 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 как виновного виновника.

3 голосов
/ 03 февраля 2009

Я подозреваю, что разница в том, что один - обычный цвет 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);
    }

Немного неуклюже, но это должно сработать.

2 голосов
/ 09 марта 2010

Или вы можете просто набрать:

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();
0 голосов
/ 02 марта 2012

Простой способ:

myButton.BackColor = Color.Empty
...