想要一个按钮在单击后禁用30秒并自动启用它

我正在进行一个项目,这个项目需要从random.org中随机取16个字节。 我可以从网站上获取它并将这16个字节写入textedit。 我也有一个刷新按钮。 每次单击此按钮时,都会出现新的16字节,并以textedit编写。

我想阻止用户按顺序单击刷新按钮。 我想要的是在点击后禁用刷新按钮。 但是,我想要的另一件事是在30秒后自动启用此按钮。

我已经在按钮单击事件中尝试了thread.sleep(30000) ,但它会使整个程序停止30秒。 我想禁用刷新按钮30秒,而不是程序的其余部分。

我想向用户展示一种秒表,以便他们可以看到他们应该等待下一次点击的时间。 例如,在他们点击刷新按钮后,会出现这个30秒的秒表。

尝试这样的事情:

 System.Windows.Forms.Timer timer = new System.Windows.Forms.Timer(); private void button1_Click(object sender, EventArgs e) // event handler of your button { timer.Interval = 30000; // here time in milliseconds timer.Tick += timer_Tick; timer.Start(); button1.Enabled = false; // place get random code here } void timer_Tick(object sender, System.EventArgs e) { button1.Enabled = true; timer.Stop(); } 

如果我们在这里谈论WPF,有一种方法可以使用EventTriggers实现所需的行为而不需要任何代码隐藏:

   

尝试使用计时器,勾选后启用按钮。 有关更多信息,请访问: http : //www.dotnetperls.com/timer

 System.Windows.Forms.Timer timer1 = new System.Windows.Forms.Timer(); timer1.Interval=1000;//one second timer1.Tick += new System.EventHandler(timer1_Tick); timer1.Start(); int count=30; private void timer1_Tick(object sender, EventArgs e) { if(count!=0) { button1.Enabled=false; label1.Text = count.ToString() +" seconds more to Enable Refresh Button"; count--; } else { button1.Enabled=true; timer1.Stop(); } } 

使用计时器有一个片段来创建计时器http://dotnet-snippets.de/snippet/timer-anlegen/111

在单击按钮时禁用按钮并启动计时器。 在勾选启用按钮并停止计时器。

根据user2737037的回答,这是一个非常有效的代码隐藏方法。

这样,您就不必声明任何成员字段,这样可以保持代码清洁。

 private void btnFoo_Click(object s, RoutedEventArgs e) { var btn = (Button)sender; btn.IsEnabled = false; //Disable button. var fooTimer = new System.Timers.Timer(5000); //Exceute after 5000 milliseconds timer.Elapsed += (fooTimer_s, fooTimer_e) => { //It has to be dispatched because of thread crossing if you are using WPF. Dispatcher.Invoke(()=> { btn.IsEnabled = true; //Bring button back to life by enabling it. fooTimer.Dispose(); }); }; fooTimer.Start(); //Insert your code here :) }