我希望在长时间按下Button
时重复操作,例如MP3阅读器的前进按钮。 WinForm中是否存在c#事件?
我可以处理MouseDown
事件以启动计时器,该计时器将执行操作并在MouseUp
事件中停止它,但我正在寻找一种更简单的方法来解决此问题=>即:没有Timer
(或线程/任务......)的解决方案。
答案 0 :(得分:4)
更新:最短路:
使用Anonymous Methods
和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();
};
}
答案 1 :(得分:0)
您可以在MouseDown和MouseUp之间使用计时器。
MouseDownEvent
Timer tm1;
MouseUpEvent
Timer tm2;
您可以在两个计时器之间轻松处理它们。
答案 2 :(得分:0)
您需要在按下按钮时执行某些操作,例如在MP3轨道中跳过几秒钟。
启动一个在mouseUp上取消的计时器,在按钮关闭的情况下定期触发那种工作(100ms?)对我来说似乎是可行的。易于实现,并且在UI上无阻塞。
更简单的解决方案可能会导致UI阻止。
答案 3 :(得分: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);
}
答案 4 :(得分:0)
最短的方式(没有任何任务/线程/计时器和秒表):)
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;
}