2012-10-09 24 views
5

Chcę powtórzyć czynność, gdy przez dłuższy czas naciśnięty zostanie przycisk Button, na przykład przycisk przewijania do przodu czytnika MP3. Czy istnieje jakieś zdarzenie C# w WinForm?Długie naciśnięcie przycisku

mogę obsłużyć zdarzenia MouseDown aby uruchomić stoper, które przeprowadzą działania i zatrzymać go na MouseUp imprezy, ale szukam łatwiejszy sposób, aby rozwiązać ten problem => czyli: Roztwór bez Timer (lub wątku/Zadanie ...).

Odpowiedz

0

Możesz użyć minutnika między MouseDown a MouseUp.

MouseDownEvent 

Timer tm1; 

MouseUpEvent 

Timer tm2; 

Można z łatwością obsługiwać je między dwoma licznikami.

0

Musisz wykonać jakąś czynność, gdy przycisk zostanie naciśnięty, np. Przeskakując kilka sekund w ścieżce MP3.

Uruchamianie licznika czasu, który zostanie anulowany przy użyciu funkcji MouseUp, która uruchamia ten rodzaj pracy w regularnych odstępach czasu (100 ms?), Gdy przycisk jest wyłączony, wydaje się być dla mnie wykonalny. Łatwy do wdrożenia i nie blokuje interfejsu użytkownika.

Bardziej proste rozwiązanie prawdopodobnie spowoduje zablokowanie interfejsu użytkownika.

4

AKTUALIZACJA: Najkrótsza droga:

Korzystanie Anonymous Methods i 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

Lepiej zrezygnować z subskrypcji zdarzenia Tick na MouseUp. –

+0

Nie zapomnij również wyrzucić timera. – Joe

+0

Używasz 'Timera', a metoda anonimowa jest tylko najkrótsza, zamiast zapisywania prawdziwej metody. Czy to nie istnieje w Framework 4.0? –

0

mogę obsłużyć zdarzenia MouseDown zacząć czasomierza, które przeprowadzą działania i zatrzymać go na razie mouseUp, ale Szukam łatwiejszy sposób rozwiązania tego problemu.

Możesz to ułatwić, pisząc raz w sposób wielokrotnego użytku. Można wyprowadzić własną klasę Button, która ma to zachowanie.

Lub napisać klasę, którą można dołączyć do dowolnego przycisku, aby nadać temu zachowanie. Na przykład można zrobić coś takiego:

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

Można by następnie używać go w sposób następujący:

private void Form1_Load(object sender, EventArgs e) 
{ 
    ButtonClickRepeater repeater = new ButtonClickRepeater(this.myButton, 1000); 
    repeater.Click += new EventHandler(repeater_Click); 
} 

lub bardziej zwięźle, ponieważ nie trzeba zachować odniesienie do ButtonClickRepeater:

private void Form1_Load(object sender, EventArgs e) 
{ 
    new ButtonClickRepeater(this.myBbutton, 1000).Click += new EventHandler(repeater_Click); 
} 
Powiązane problemy