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

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

  •  21-08-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

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

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top