2012-10-09 91 views
5

Quiero repetir una acción cuando se presiona un Button durante un tiempo prolongado, como por ejemplo el botón de avance de un lector de MP3. ¿Hay un evento C# existente en WinForm?Botón de pulsación larga

que puede controlar el evento MouseDown para iniciar un temporizador que llevará a cabo la acción y detenerlo en MouseUp caso, pero estoy buscando una manera más fácil de resolver este problema => es decir: una solución sin Timer (o hilo/Tarea ...).

Respuesta

0

Puede usar el temporizador entre MouseDown y MouseUp.

MouseDownEvent 

Timer tm1; 

MouseUpEvent 

Timer tm2; 

Puede manejarlos fácilmente entre dos temporizadores.

0

Deberá realizar alguna acción mientras se presiona el botón, como saltar unos segundos en la pista de MP3.

Arrancar un temporizador que se cancela en el mouseUp que desencadena ese tipo de trabajo en un intervalo regular (100ms?) Mientras el botón está inactivo parece viable para mí. Fácil de implementar y no bloquea en la interfaz de usuario.

Una solución más simple probablemente hará que la IU se bloquee.

4

ACTUALIZADO: Camino más corto:

Usando Anonymous Methods y Object Initializer:

public void Repeater(Button btn, int interval) 
{ 
    var timer = new Timer {Interval = interval}; 
    timer.Tick += (sender, e) => DoProgress(); 
    btn.MouseDown += (sender, e) => timer.Start(); 
    btn.MouseUp += (sender, e) => timer.Stop(); 
    btn.Disposed += (sender, e) => 
         { 
          timer.Stop(); 
          timer.Dispose(); 
         }; 
} 
+0

Es mejor anular la suscripción al evento Tick en el MouseUp también. –

+0

Además, no se olvide de desechar el temporizador. – Joe

+0

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? –

0

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); 
} 
Cuestiones relacionadas