I want to repeat an action when a Button
is pressed during a long time, like for example the forward button of an MP3 reader. Is there an existing c# event in WinForm ?
I can handle the MouseDown
event to start a timer which will perform the action and stop it on MouseUp
event, but I am looking for an easier way to solve this problem => ie : a solution without a Timer
(or Thread / Task ...).
UPDATED: Shortest way:
Using Anonymous Methods
and 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();
};
}
shortest way (and without any task/thread/timer & stopwatch) :)
DateTime sw;
bool buttonUp = false;
const int holdButtonDuration = 2000;
private void btnTest_MouseDown(object sender, MouseEventArgs e)
{
buttonUp = false;
sw = DateTime.Now;
while (e.Button == MouseButtons.Left && e.Clicks == 1 && (buttonUp == false && (DateTime.Now - sw).TotalMilliseconds < holdButtonDuration))
Application.DoEvents();
if ((DateTime.Now - sw).TotalMilliseconds < holdButtonDuration)
Test_ShortClick();
else
Test_LongClick();
}
private void btnTest_MouseUp(object sender, MouseEventArgs e)
{
buttonUp = true;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With