在FOR循环中更新时,按钮的背景颜色不会改变

时间:2018-02-09 16:29:14

标签: vb.net

在Visual Studio 2017中,在Windows窗体应用程序(.NET Framework)中的Visual Basic中工作。

我试图创建一个按钮,其中按钮的背景颜色是渐变的渐变。我做了一个简单的算法来进行渐变变换,并使用时间延迟函数在颜色变化之间等待。但是,颜色在执行时不会在for循环中更新,只显示最终结果,那么如何解决呢?认为它是时间延迟功能的问题,但不确定,无论如何这里是代码:

Public Class Form1
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    End Sub

    Public Sub bg_MouseClick(sender As Object, e As MouseEventArgs) Handles bg.MouseClick

        Dim r As Integer = 241
        Dim g As Integer = 121
        Dim b As Integer = 121

        For x = g To r
            g += 1
            bg.BackColor = Color.FromArgb(r, g, b)
            timeDelay(0.01)
        Next

        For x = b To r
            r -= 1
            bg.BackColor = Color.FromArgb(r, g, b)
            timeDelay(0.01)
        Next

        For x = b To g
            b += 1
            bg.BackColor = Color.FromArgb(r, g, b)
            timeDelay(0.01)
        Next

        For x = r To g
            g -= 1
            bg.BackColor = Color.FromArgb(r, g, b)
            timeDelay(0.01)
        Next

        For x = g To b
            r += 1
            bg.BackColor = Color.FromArgb(r, g, b)
            timeDelay(0.01)
        Next

        For x = g To b
            b -= 1
            bg.BackColor = Color.FromArgb(r, g, b)
            timeDelay(0.01)
        Next

        MessageBox.Show("Finished")
    End Sub
    Public Sub timeDelay(ByVal secondsDelayedBy As Double)
        Dim stopwatch As New Stopwatch
        Dim endtimer = False
        stopwatch.Start()
        Do Until endtimer = True
            If stopwatch.ElapsedMilliseconds > (secondsDelayedBy * 1000) Then
                endtimer = True
                stopwatch.Stop()
            End If
        Loop
    End Sub

End Class

2 个答案:

答案 0 :(得分:1)

这很糟糕,因为您的代码在UI线程上运行,并在不刷新界面的情况下锁定它,并且它实际显示任何更新的唯一时间是代码完成运行。

要更新你的按钮颜色,你可以在@TnTinMn上提及他的评论使用a 在for循环中使用bg.Refresh,或使用异步子并在分离的线程上运行它。

使用bg.Refresh你的循环将如下所示:

For x = g To r
    g += 1
    bg.BackColor = Color.FromArgb(r, g, b)
    bg.Refresh()
    timeDelay(0.01)
Next

使用异步方法:

Public Async Sub bg_MouseClick(sender As Object, e As MouseEventArgs) Handles bg.MouseClick

    Dim r As Integer = 241
    Dim g As Integer = 121
    Dim b As Integer = 121

    Await Task.Run(Sub()
                       For x = g To r
                           g += 1
                           SetButtonColor(bg, Color.FromArgb(r, g, b))
                           timeDelay(0.01)
                       Next

                       'Other for Loops...

                   End Sub)

    MessageBox.Show("Finished")
End Sub

Public Sub SetButtonColor(Button As Button, Color As Color)
    If Button.InvokeRequired Then
        Button.Invoke(Sub() SetButtonColor(Button, Color))
    Else
        Button.BackColor = Color
    End If
End Sub

答案 1 :(得分:-2)

更改所有' timeDelay(0.01)'致电:Threading.Thread.Sleep(10) : Application.DoEvents()