我希望当在很长一段时间按下Button
,例如像一个MP3读取器的前进按钮来重复一个动作。 WinForm中是否存在c#事件?长按按钮
我可以处理MouseDown
事件开始将执行的操作,并停止它MouseUp
事件定时器,但是我正在寻找解决这个问题=>即一个简单的方法:没有Timer
溶液(或线程/任务...)。
我希望当在很长一段时间按下Button
,例如像一个MP3读取器的前进按钮来重复一个动作。 WinForm中是否存在c#事件?长按按钮
我可以处理MouseDown
事件开始将执行的操作,并停止它MouseUp
事件定时器,但是我正在寻找解决这个问题=>即一个简单的方法:没有Timer
溶液(或线程/任务...)。
可以使用的MouseDown和MouseUp之间的计时器。
MouseDownEvent
Timer tm1;
MouseUpEvent
Timer tm2;
您可以在两个定时器之间轻松处理它们。
同时按下按钮,像MP3音轨跳过几秒钟您需要执行一些动作。
开始是大干快上mouseUp事件取消了定时器触发这种工作,定期间隔(100ms的?),而按键时似乎可行的我。易于实施,并且在用户界面上不受阻挡。
一个更简单的解决方案可能会导致UI来阻止。
更新时间:最短途径:
使用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();
};
}
我可以处理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);
}
更好地取消订阅MouseUp上的Tick事件。 –
另外不要忘记处理定时器。 – Joe
你正在使用'Timer',匿名方法只是一个最简单的方法,而不是写一个真正的方法。这是否存在于Framework 4.0中? –