puedo controlar el evento MouseDown para iniciar un temporizador que llevará a cabo la acción y dejar que el evento MouseUp, pero Estoy buscando una manera más fácil de resolver este problema.
Puede hacerlo más fácil escribiéndola una vez de forma reutilizable. Puede derivar su propia clase Button
que tenga este comportamiento.
O escriba una clase que pueda adjuntar a cualquier botón para que tenga este comportamiento. Por ejemplo, usted podría hacer algo como:
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);
}
}
A continuación, se utilizaría la siguiente manera:
private void Form1_Load(object sender, EventArgs e)
{
ButtonClickRepeater repeater = new ButtonClickRepeater(this.myButton, 1000);
repeater.Click += new EventHandler(repeater_Click);
}
o más concisa, ya que no es necesario para mantener una referencia a ButtonClickRepeater
:
private void Form1_Load(object sender, EventArgs e)
{
new ButtonClickRepeater(this.myBbutton, 1000).Click += new EventHandler(repeater_Click);
}
Es mejor anular la suscripción al evento Tick en el MouseUp también. –
Además, no se olvide de desechar el temporizador. – Joe
Está utilizando un 'Timer' y el método anónimo es solo el camino más corto en lugar de escribir un método real. ¿Esto no existe en el Framework 4.0? –