如何在VB.Net中使用计时器?

时间:2014-08-12 07:32:03

标签: wpf vb.net dispatchertimer

我正在尝试用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

1 个答案:

答案 0 :(得分:4)

用户界面仅在所有代码执行完毕后才会更新。因此,您没有看到对Blue的更改。更糟糕的是,你的用户界面完全冻结了0.5秒。

执行此操作的正确方法是:

  1. 将颜色设置为蓝色
  2. Set a timer以0.5秒过期,并将颜色设置为白色。
  3. 其他替代方案包括:

    • 启动一个等待0.5秒的新线程,然后更改颜色(请务必使用Dispatcher.Invoke此处更改UI线程中的颜色)或
    • start a BackgroundWorker等待0.5秒并更改RunWorkerCompleted中的颜色(已在UI线程中执行)或
    • 使用 asnyc 等待(例如await Task.Delay(500)),这会导致在等待期间更新和响应用户界面。