Вы делаете это в потоке пользовательского интерфейса.Если вы блокируете поток пользовательского интерфейса с помощью Thread.Sleep
, пользовательский интерфейс также блокируется (и никакие изменения не применяются).
Решение состоит в том, чтобы использовать таймер вместо цикла.Сохраните c
в некоторой переменной вашего окна.Установите таймер, который истекает через 3 мс, увеличивает c
, изменяет Color
, а затем сбрасывает таймер, чтобы он снова отключился через 3 мс.
В качестве альтернативы, вы можете запустить фоновый поток, который циклично (и используетThread.Sleep
).В этом случае вы должны применить изменение цвета через Dispatcher.Invoke
вместо простой установки Color = ...
.
Чтобы проиллюстрировать мою точку зрения, вот краткий пример того, как это сделать с фоновым потоком:
// define the background thread
var colorChangeThread = new Thread(new ThreadStart(() => {
for (int c = 0; c < 255; c++)
{
// this (and only this) is done in the UI thread
Dispatcher.Invoke(new Action(() => {
this.Background = new SolidColorBrush(Color.FromArgb(255, (byte)c, (byte)(255 - c), (byte)c));
}));
Thread.Sleep(8); // the background thread waits
}
}));
colorChangeThread.Start(); // start the background thread
Если вы используете свойства с INotifyPropertyChanged, вы можете пропустить Dispatcher.Invoke и просто установить свое свойство, см. Объяснение в ответе Meleaks.