7

ButtonMP3 リーダーの進むボタンのように、a を長時間押したときにアクションを繰り返したい。WinForm に既存の c# イベントはありますか?

イベントを処理してMouseDown、アクションを実行し、イベントで停止するタイマーを開始できますMouseUpが、この問題を解決する簡単な方法を探しています=>つまり、Timer(またはスレッド/タスク...)のないソリューション。

4

5 に答える 5

7

更新:最短の方法:

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();
                        };
}
于 2012-10-09T10:35:26.607 に答える
0

ボタンが押されている間、MP3 トラックで数秒スキップするなど、何らかのアクションを実行する必要があります。

ボタンが押されている間、一定の間隔(100ms?)でそのような作業をトリガーするmouseUpでキャンセルされるタイマーを開始することは、私には実行可能のようです。実装が簡単で、UI をブロックしません。

より単純な解決策では、UI がブロックされる可能性があります。

于 2012-10-09T10:05:10.433 に答える
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);
}
于 2012-10-09T11:02:23.413 に答える
0

MouseDown と MouseUp の間でタイマーを使用できます。

MouseDownEvent

Timer tm1;

MouseUpEvent

Timer tm2;

2 つのタイマー間で簡単に処理できます。

于 2012-10-09T10:01:10.457 に答える