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

Wpf 如何在VB.Net中使用定时器?,wpf,vb.net,dispatchertimer,Wpf,Vb.net,Dispatchertimer,我正在尝试用VB.Net编程一个迪斯科灯光机。 我在WPF上有四个椭圆,我希望它们“亮起”(=将填充从白色更改为某种颜色),然后等待0.5s,然后将填充更改回白色-所有操作都按照预先编写的顺序进行 我试图使用dispatherimer,但实际上我不知道如何让它工作。 省略号是名称pad0、pad1等 Public Sub timer() Dim t As New System.Windows.Threading.DispatcherTimer() AddHandler t.Tic

我正在尝试用VB.Net编程一个迪斯科灯光机。 我在WPF上有四个椭圆,我希望它们“亮起”(=将填充从白色更改为某种颜色),然后等待0.5s,然后将填充更改回白色-所有操作都按照预先编写的顺序进行

我试图使用dispatherimer,但实际上我不知道如何让它工作。 省略号是名称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
UI仅在执行所有代码后更新。因此,您看不到蓝色的变化。更糟糕的是,你的UI完全冻结了0.5秒

正确的方法是:

  • 将颜色设置为蓝色
  • 在0.5s后过期,并将颜色设置为白色
  • 其他备选方案包括:

    • 启动一个等待0.5s的新线程,然后更改颜色(请确保使用Dispatcher.Invoke在此处更改UI线程中的颜色)或
    • 等待0.5s并更改RunWorkerCompleted(已在UI线程中执行)中的颜色,或
    • 使用asnyc等待(例如,
      wait Task.Delay(500)
      ),这会导致UI在等待期间得到更新和响应
    用户界面仅在执行所有代码后更新。因此,您看不到蓝色的变化。更糟糕的是,你的UI完全冻结了0.5秒

    正确的方法是:

  • 将颜色设置为蓝色
  • 在0.5s后过期,并将颜色设置为白色
  • 其他备选方案包括:

    • 启动一个等待0.5s的新线程,然后更改颜色(请确保使用Dispatcher.Invoke在此处更改UI线程中的颜色)或
    • 等待0.5s并更改RunWorkerCompleted(已在UI线程中执行)中的颜色,或
    • 使用asnyc等待(例如,
      wait Task.Delay(500)
      ),这会导致UI在等待期间得到更新和响应

    这是一个事件驱动的世界。没有油漆,没有聚会,只有一张便条。类中有许多预定义的画笔
    画笔
    ,例如
    画笔.White
    。不需要创建自己的代码。@Clemens谢谢,我已经更新了代码。这是一个事件驱动的世界。没有油漆,没有聚会,只有一张便条。类中有许多预定义的画笔
    画笔
    ,例如
    画笔.White
    。不需要创建自己的代码。@Clemens谢谢,我已经更新了我的代码。这是WPF。请不要使用Timer和Control.Invoke。这里有
    dispatchermer
    。@Clemens:注意,我把“timer”小写了。请注意,它后面的链接已经链接到
    DispatcherTimer
    的描述,这是WPF的正确计时器。@Clemens:啊,是的,它是Dispatcher.Invoke,在WPF中。谢谢,修好了。@Heinzi谢谢。我想用定时器。我已经更新了我的代码,但仍然不知道如何让它工作。我很乐意得到更多的帮助。这是WPF。请不要使用Timer和Control.Invoke。这里有
    dispatchermer
    。@Clemens:注意,我把“timer”小写了。请注意,它后面的链接已经链接到
    DispatcherTimer
    的描述,这是WPF的正确计时器。@Clemens:啊,是的,它是Dispatcher.Invoke,在WPF中。谢谢,修好了。@Heinzi谢谢。我想用定时器。我已经更新了我的代码,但仍然不知道如何让它工作。我很乐意得到更多的帮助。