Button
MP3 リーダーの進むボタンのように、a を長時間押したときにアクションを繰り返したい。WinForm に既存の c# イベントはありますか?
イベントを処理してMouseDown
、アクションを実行し、イベントで停止するタイマーを開始できますMouseUp
が、この問題を解決する簡単な方法を探しています=>つまり、Timer
(またはスレッド/タスク...)のないソリューション。
更新:最短の方法:
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();
};
}
ボタンが押されている間、MP3 トラックで数秒スキップするなど、何らかのアクションを実行する必要があります。
ボタンが押されている間、一定の間隔(100ms?)でそのような作業をトリガーするmouseUpでキャンセルされるタイマーを開始することは、私には実行可能のようです。実装が簡単で、UI をブロックしません。
より単純な解決策では、UI がブロックされる可能性があります。
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);
}
MouseDown と MouseUp の間でタイマーを使用できます。
MouseDownEvent
Timer tm1;
MouseUpEvent
Timer tm2;
2 つのタイマー間で簡単に処理できます。