AS01234 Ответов: 2

Почему в C# установка button1.backcolor на свое собственное значение приводит к цветовому фрагменту?


Если я запущу это (в Form1_Load, не написав никакого другого кода в проекте):
Color buttonOriginalColor = button1.BackColor;
button1.BackColor = buttonOriginalColor;

кнопка отображается белым цветом на форме. Если я закомментирую вторую строку (или закомментирую обе строки, или выполню ее вообще без кода, написанного мной во всем проекте приложения Form):
Color buttonOriginalColor = button1.BackColor;
//button1.BackColor = buttonOriginalColor;

теперь Кнопка выходит обычного серого цвета, который немного темнее, чем я получаю с первым кодом. Это также тот же самый цвет, который показан в конструкторе.

В обоих случаях, если я поставлю точку останова в конце Form1_Load и посмотрю на button1.BackColor , он отображается как цвет "{Control,ARGB=(255,240,240,240)}".

Почему установка BackColor элемента управления button на его собственное значение приводит к изменению цвета? Есть ли что-то не так с моей установкой Visual Studio 2017 ?

Что я уже пробовал:

Ничего. Я просто хочу понять, почему он меняет цвет, когда я устанавливаю button1.Цвет фона для своей стоимости.

0x01AA

Интересная штука, +5 за вопрос. Кстати. Я могу это воспроизвести.
[Редактировать]
Когда я использую colorpicker от, например, Snagit, немодифицированная кнопка показывает RGB(225, 225, 225)

2 Ответов

Рейтинг:
5

Luc Pattyn

Привет,

в конце концов, это довольно сложно.

Стандартная кнопка будет вести себя так, как вы испытали, независимо от того, какие версии Visual Studio или Windows вы используете.

На самом деле кнопка запускается сразу же, не показывая ожидаемого цвета, так как ее BackColor по умолчанию-SystemColors.Контроль, который является тем же самым для формы, однако он выглядит намного темнее.

Это происходит только после того, как вы явно установите его в SystemColors.Контролируйте, чтобы он рисовал себя, используя выбранный задний цвет.

Виновник - это непонятное свойство UseVisualStyleBackColor который по умолчанию имеет значение true. Установка BackColor явно очищает это логическое значение; только тогда кнопка будет подчиняться своему свойству BackColor.

Еще один способ приблизиться к интуитивному поведению-это установка FlatStyle в FlatStyle.Система (по умолчанию кнопки имеют плоский стиль.Стандарт).

Я не понимаю логики всего этого, кажется, что они продолжают добавлять "интеллект", что делает все это довольно трудным для понимания...

:)


0x01AA

Так еще 5 :)

AS01234

Спасибо всем. Я обнаружил эту проблему, когда просто пытался изменить цвет кнопки на определенный период времени, а затем изменить его обратно на исходный цвет, чтобы указать, что программа завершила действие, которое она выполняла в фоновом режиме. Затем я упростил его до этого примера из двух строк. Это кажется очень распространенной ситуацией, и это приводит в замешательство, что элементы управления формами ведут себя таким неожиданным образом. Я думаю, что обходной путь для моей потребности состоит в том, чтобы изменить все цвета кнопок в начале в Form1_Load. Какая заноза в шее.

Luc Pattyn

Пожалуйста.

Выполнение операции со всеми элементами управления определенного типа выполнимо с помощью цикла foreach для элементов управления, что - то вроде:

foreach (Control c in Controls) {
    Button b=c as Button;
    if (b!=null) b.SomeProperty=SomeValue;
}


Если ваша форма несколько иерархична, например, некоторые кнопки расположены внутри контейнера (например, панели), то в целом вам нужна рекурсия, чтобы справиться с этим.

:)

Рейтинг:
0

Luc Pattyn

Установка обратного цвета, по-видимому, активирует кнопку, поэтому теперь она выглядит по-другому.

Попробуйте сделать это с двумя кнопками, или активировать что-то еще после этого, и вы увидите...

РЕДАКТИРОВАТЬ

Нет, это не так, все еще расследую...

:)


0x01AA

Но если я отлаживаю button1 и button2, то они показывают один и тот же "более светлый" цвет при загрузке формы, который не является тем цветом, с которым они отображаются. Смущенный :)

Luc Pattyn

Действительно, что-то здесь не так.
Свойства BackColor прекрасны, отклоняется только то, как окрашены "модифицированные" кнопки. Кроме того, цвет наведения очень далек.
И он плохо себя ведет с включенными визуальными стилями или без них. ???
И то же самое происходит со старым добрым VS2008...
А также на Win7

Один из способов избавиться от него-выбрать FlatStyle.Система (по умолчанию кнопки имеют плоский стиль.Стандарт) что бы это ни значило.

0x01AA

Во всяком случае, 5, это тоже для храбрости, чтобы исправить его.
Я пытаюсь найти причину в эталонной реализации, но это кажется безнадежным :(