首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在一段时间内更改按钮的颜色

在一段时间内更改按钮的颜色
EN

Stack Overflow用户
提问于 2018-06-14 03:28:14
回答 3查看 792关注 0票数 0

我有一个小的VB.net应用程序,有很多按钮。我需要在单击按钮时更改按钮的背景颜色,然后在持续10秒后将其设置回原始颜色。我正在为使用计时器或时间处理而苦苦挣扎,这两种方法都有自己的问题。

有没有什么办法能让这件事变得高效?

代码:

代码语言:javascript
复制
Private Sub MyButtons_Click(sender As Object, e As EventArgs) _
Handles Button1.Click,
Button2.Click

    Dim myButton = DirectCast(sender, Button)
    MakeCall()
    myButton.BackColor = Color.Green
    'TurnOnActiveCallCOLOR.Enabled = True
    For i As Integer = 0 To 10000 - 1
        Threading.Thread.Sleep(10000)
    Next
    myButton.BackColor = Color.FromArgb(64, 64, 64)
End Sub
EN

回答 3

Stack Overflow用户

发布于 2018-06-14 03:54:57

下面是一个使用Windows窗体计时器来完成所需操作的示例:

代码语言:javascript
复制
Private MyButton As Button

Private Sub MyButtons_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
   MyButton = DirectCast(sender, Button)
   MyButton.BackColor = Color.Green

   Timer1.Enabled = True

   MakeCall()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
   MyButton.BackColor = Color.FromArgb(64, 64, 64)
   Timer1.Enabled = False
End Sub
票数 2
EN

Stack Overflow用户

发布于 2018-06-14 04:50:24

要处理任意数量的按钮,可以使用如下代码:

代码语言:javascript
复制
Public Class Form1

    Dim buttonTimers As New Dictionary(Of Control, ButtonTimer)

    Class ButtonTimer
        Property Timeout As Integer = 2000
        Property Target As Control
        Property ActiveColor As Color = Color.Green
        Property DefaultColor As Color = Color.FromArgb(64, 64, 64)

        Private tim As Timer

        Sub TimTick(sender As Object, e As EventArgs)
            tim.Stop()
            Target.BackColor = DefaultColor
        End Sub

        Sub New()
            ' empty constructor
        End Sub

        Sub New(target As Control)
            Me.Target = target
            Me.Target.BackColor = Me.ActiveColor
            tim = New Timer With {.Interval = Timeout}
            AddHandler tim.Tick, AddressOf TimTick
            tim.Start()

        End Sub

        Sub Restart()
            Target.BackColor = Me.ActiveColor
            If tim IsNot Nothing Then
                tim.Stop()
                tim.Start()
            End If
        End Sub

        Public Sub DisposeOfTimer()
            If tim IsNot Nothing Then
                tim.Stop()
                RemoveHandler tim.Tick, AddressOf TimTick
                tim.Dispose()
            End If

        End Sub

    End Class


    Private Sub Button_Click(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click
        Dim myButton = DirectCast(sender, Button)

        'MakeCall()

        If buttonTimers.ContainsKey(myButton) Then
            buttonTimers(myButton).Restart()
        Else
            buttonTimers.Add(myButton, New ButtonTimer(myButton))
        End If

    End Sub

    Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles MyBase.FormClosing
        For Each x In buttonTimers
            x.Value.DisposeOfTimer()
        Next

    End Sub

End Class

如果在超时之前再次单击按钮,则会重新启动计时器。

如果你想为不同的按钮设置不同的超时/颜色,你可以添加其他的构造函数。

MyBase.FormClosing代码应该包含在窗体关闭处理程序中(如果有),以便正确清除计时器。

我希望从总体上来说,创建一个继承自Button的自定义按钮类会更整洁一些,所以你可能会考虑这样做。(How to: Inherit from Existing Windows Forms Controls.)

票数 2
EN

Stack Overflow用户

发布于 2018-06-14 20:53:27

异步和等待,如果你不想使用计时器。使用task.delay的简单方法

代码语言:javascript
复制
Private Async Sub ButtonClick(sender As Object, e As EventArgs) Handles Button1.Click, Button2.Click, Button3.Click, Button4.Click
    DirectCast(sender, Button).BackColor = Color.Red 'after click setcolor to red
    Await setColorAfterDelay(sender) 'Add this comand on button click and don't forget add asynh before sub in this method
End Sub

Public Async Function setColorAfterDelay(sender As Object) As Task
    Await Task.Delay(1000) ''Milisecound how long you wana dealey
    DirectCast(sender, Button).BackColor = Color.White 'and set colorto white
End Function
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50844869

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档