Как использовать таймер в VB.Net?

Я пытаюсь запрограммировать дискотеку в VB.Net. У меня есть четыре эллипса в WPF, и я хочу, чтобы они "загорелись" (=изменили заливку с белого на какой-то цвет), затем подождали 0,5 с, затем снова изменили заливку на белый цвет - все по заранее написанной последовательности.

Я пытаюсь использовать DispatherTimer, но на самом деле я не знаю, как заставить его работать. Многоточие - это имя pad0, pad1 и т.д.

Public Sub timer()
    Dim t As New System.Windows.Threading.DispatcherTimer()
    AddHandler t.Tick, AddressOf dispatcherTimer_Tick
    t.Interval = New TimeSpan(0, 0, 1)
End Sub

Private Sub dispatcherTimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
End Sub

Private Sub play_Click(sender As Object, e As RoutedEventArgs) Handles play.Click
    Dim sequence = New Integer() {1, 0, 3, 2}
    For i As Integer = 0 To 3
        Select Case sequence(i)
            Case 0
                pad0.Fill = Brushes.Blue
                **this is where I want the timer to run!**
                padOff(pad0)
            Case 1
                pad1.Fill = Brushes.Yellow
                **this is where I want the timer to run!**
                padOff(pad1)
            Case 2
                pad2.Fill = Brushes.Green
                **this is where I want the timer to run!**
                padOff(pad2)
            Case 3
                pad3.Fill = Brushes.Red
                **this is where I want the timer to run!**
                padOff(pad3)
        End Select
    Next
End Sub

Public Sub padOff(ByVal pad As Shape)
    pad.Fill = Brushes.White
End Sub

person OzW    schedule 12.08.2014    source источник
comment
Это мир, управляемый событиями. Нет краски, нет вечеринки   -  person Steve    schedule 12.08.2014
comment
Просто заметка. В классе Brushes есть много предопределенных кистей, например, Brushes.White. Нет необходимости создавать свои собственные.   -  person Clemens    schedule 12.08.2014
comment
@Clemens Спасибо, я обновил свой код.   -  person OzW    schedule 12.08.2014


Ответы (1)


Пользовательский интерфейс обновляется только после выполнения всего вашего кода. Таким образом, вы не видите изменения в Blue. Хуже того, ваш пользовательский интерфейс полностью зависает на 0,5 с.

Правильный способ сделать это:

  1. Установите цвет на синий
  2. Установите таймер на истечение 0,5 с и установите белый цвет.

Другие альтернативы включают:

  • Запустите новый поток, который ждет 0,5 с, а затем меняет цвет (обязательно используйте здесь Dispatcher.Invoke, чтобы изменить цвет в потоке пользовательского интерфейса) или
  • запустите BackgroundWorker, который ожидает 0,5 с и меняет цвет в RunWorkerCompleted (который уже выполняется в потоке пользовательского интерфейса) или,
  • используйте ожидание asnyc (например, await Task.Delay(500)), которое заставляет пользовательский интерфейс обновляться и реагировать в течение периода ожидания.
person Heinzi    schedule 12.08.2014
comment
Это ВПФ. Пожалуйста, не используйте Timer и Control.Invoke. Вместо этого есть DispatcherTimer. - person Clemens; 12.08.2014
comment
@Clemens: Точка понятна, я таймер в нижнем регистре. Обратите внимание, что ссылка за ним уже указывает на описание DispatcherTimer, которое является правильным таймером для WPF. - person Heinzi; 12.08.2014
comment
@Clemens: Ах, да, это Dispatcher.Invoke в WPF. Спасибо, исправлено. - person Heinzi; 12.08.2014
comment
@Хайнци Спасибо. Я пытаюсь использовать таймер. Я обновил свой код, но до сих пор не знаю, как заставить его работать. Был бы рад получить дополнительную помощь. - person OzW; 12.08.2014