public class FlashOnceButton : Button
{
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.flashTimer.Dispose();
}
}
}
要确保在释放窗体时释放按钮,最简单的方法是将它定位到窗体的组件字段:
public void MyForm()
{
InitializeComponent(); // this will create flashOnceButton1
// make sure that the button is disposed when the Form is disposed:
this.components.Add(this.flashOnceButton1);
}
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Timer _colorTimer; // Create a timer as a private field to capture the ticks
private Stopwatch _swColor; // Create a stopwatch to determine how long you want the color to change
private void Form1_Load(object sender, EventArgs e)
{
// Initialize fields
_colorTimer = new Timer();
_colorTimer.Interval = 10; // in milliseconds
_colorTimer.Tick += ColorTimer_Tick; // create handler for timers tick event
_swColor = new Stopwatch();
NameField.Text = "Person Name"; // For testing purposes
}
// the timer will run on a background thread (not stopping UI), but will return to the UI context when handling the tick event
private void ColorTimer_Tick(object sender, EventArgs e)
{
if(_swColor.ElapsedMilliseconds < 1000) // check elapsed time - while this is true the color will be changed
{
if(NameField.ForeColor != Color.Red)
{
NameField.ForeColor = Color.Red;
}
}
else
{
// reset the controls color, stop the stopwatch and disable the timer (GC will handle disposal on form close)
NameField.ForeColor = Color.Black;
_swColor.Stop();
_swColor.Reset();
_colorTimer.Enabled = false;
}
}
private void btnChangeColor_Click(object sender, EventArgs e)
{
// on button click start the timer and stopwatch
_colorTimer.Start();
_swColor.Start();
}
}
5条答案
按热度按时间wkyowqbh1#
最简单的方法是使用Task.Delay。假设您希望在单击按钮时执行此操作:
计时器是另一种选择,但如果只希望它触发一次,则需要在事件处理程序中禁用计时器。
Task.Delay
的功能大致相同,但更简洁。请记住try/catch,无论何时使用async void,您都希望捕获任何异常以确保它们不会丢失。
您可能还想考虑重复按下按钮。禁用按钮,或增加某个字段,并仅在字段的值与您设置颜色时的值相同时重置颜色。
nwlls2ji2#
在面向对象的类中,您了解到,如果您希望某个类与另一个类几乎相同,但只有一点功能不同,则应该派生。
因此,让我们创建一个从按钮派生的类,它可以更改颜色,并在一段时间后自动返回默认颜色。
按钮将有一个Flash方法,它将改变按钮的颜色。在一段指定的时间后,按钮将不闪烁。
为此,该类具有指定前景/背景颜色以及闪光时间的属性。
用法:编译后,您应该在visual studio工具箱中找到此类。因此,您可以使用visual studio设计器添加该类并设置属性。
您可以在InitializeComponent中找到它。
如果布尔函数返回false,我想将名为NameField的文本框中的文本颜色更改为红色;
就这样了!
有一个怪癖:Timer类实现IDisposable,因此如果您停止窗体,则应Dispose它
要确保在释放窗体时释放按钮,最简单的方法是将它定位到窗体的组件字段:
nhaq1z213#
我有一个解决方案给你,但它是有点低效。请检查,让我知道。
nom7f22z4#
有几种方法可以处理这个问题。最直接的方法是使用Timer。如果你想在一段时间内保持颜色的变化,那么可以使用Stopwatch来捕捉经过的时间。
vsnjm48y5#