События диспетчера отображаются слишком быстро на экране. Как я могу «замедлить» процесс? - PullRequest
0 голосов
/ 19 марта 2011

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

У меня работает цикл, который вызывает UI Dispatcher и отправляет ему функцию «paintCell», которая окрашивает ячейку (красныйили белый).Предположительно, кажется, что объект Dispatcher запускает код paintCell, но фактически не перерисовывает экран до тех пор, пока все события рендеринга в очереди не будут обработаны и удалены из очереди.Я попытался добавить: «Thread.sleep (500)», подумав, что я могу замедлить весь раздел раскраски и рендеринга, но программа действует так же в отношении интервала между окрасками ячеек - программа спит, но Вся сетка перекрашивается и обрабатывается сразу.

Требуются какие-либо пояснения?

Ответы [ 2 ]

2 голосов
/ 19 марта 2011

Вы должны использовать DispatcherTimer для операций рисования. DispatcherTimer работает в потоке пользовательского интерфейса, поэтому вы можете вызывать там свой метод paintCell без дополнительной работы:

   DispatcherTimer _timer = new DispatcherTimer();
   void StartTimer()
   {            
        _timer.Interval = new TimeSpan(0, 0, timerResolutionInSeconds);
        _timer.Tick += (s, e) => TimerElapsed();
        _timer.Start();
   }

   int cell;
   private void TimerElapsed()
   {
        paintCell(cell++);
        // .... stop timer when done
        if (done)
           _timer.Stop()
   }
2 голосов
/ 19 марта 2011

Вы не должны Sleep в потоке пользовательского интерфейса (что я подозреваю, что вы делаете), так как это блокирует весь пользовательский интерфейс на время Sleep.Вы должны сделать сон в вашем цикле, который отправляет обновления через Dispatcher (вы запускаете цикл в отдельном потоке, конечно, верно?)

...