我可以处理MouseDown事件来启动一个计时器,该计时器将执行操作,并在MouseUp事件上停止它,但我正在寻找解决这个问题的更简单的方法。
你可以通过以可重用的方式编写一次来使其更简单。你可以派生自己的Button类,具有这种行为。
或者编写一个可以附加到任何按钮的类,赋予它这种行为。例如,你可以做如下操作:
class ButtonClickRepeater
{
public event EventHandler Click;
private Button button;
private Timer timer;
public ButtonClickRepeater(Button button, int interval)
{
if (button == null) throw new ArgumentNullException();
this.button = button;
button.MouseDown += new MouseEventHandler(button_MouseDown);
button.MouseUp += new MouseEventHandler(button_MouseUp);
button.Disposed += new EventHandler(button_Disposed);
timer = new Timer();
timer.Interval = interval;
timer.Tick += new EventHandler(timer_Tick);
}
void button_MouseDown(object sender, MouseEventArgs e)
{
OnClick(EventArgs.Empty);
timer.Start();
}
void button_MouseUp(object sender, MouseEventArgs e)
{
timer.Stop();
}
void button_Disposed(object sender, EventArgs e)
{
timer.Stop();
timer.Dispose();
}
void timer_Tick(object sender, EventArgs e)
{
OnClick(EventArgs.Empty);
}
protected void OnClick(EventArgs e)
{
if (Click != null) Click(button, e);
}
}
然后您可以按以下方式使用它:
private void Form1_Load(object sender, EventArgs e)
{
ButtonClickRepeater repeater = new ButtonClickRepeater(this.myButton, 1000);
repeater.Click += new EventHandler(repeater_Click);
}
更简洁地说,因为您不需要保留对
ButtonClickRepeater
的引用:
private void Form1_Load(object sender, EventArgs e)
{
new ButtonClickRepeater(this.myBbutton, 1000).Click += new EventHandler(repeater_Click);
}
Timer
,而匿名方法只是一种比编写真正的方法更短的方式。这在 Framework 4.0 中不存在吗? - Emmanuel Chaffraix