2012-10-09 127 views
5

我希望当在很长一段时间按下Button,例如像一个MP3读取器的前进按钮来重复一个动作。 WinForm中是否存在c#事件?长按按钮

我可以处理MouseDown事件开始将执行的操作,并停止它MouseUp事件定时器,但是我正在寻找解决这个问题=>即一个简单的方法:没有Timer溶液(或线程/任务...)。

回答

0

可以使用的MouseDown和MouseUp之间的计时器。

MouseDownEvent 

Timer tm1; 

MouseUpEvent 

Timer tm2; 

您可以在两个定时器之间轻松处理它们。

0

同时按下按钮,像MP3音轨跳过几秒钟您需要执行一些动作。

开始是大干快上mouseUp事件取消了定时器触发这种工作,定期间隔(100ms的?),而按键时似乎可行的我。易于实施,并且在用户界面上不受阻挡。

一个更简单的解决方案可能会导致UI来阻止。

4

更新时间:最短途径:

使用Anonymous MethodsObject 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

更好地取消订阅MouseUp上的Tick事件。 –

+0

另外不要忘记处理定时器。 – Joe

+0

你正在使用'Timer',匿名方法只是一个最简单的方法,而不是写一个真正的方法。这是否存在于Framework 4.0中? –

0

我可以处理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); 
}