7

私はかなり基本的な C# ビジュアル スタジオ フォーム アプリケーションに取り組んでいますが、トラック バーを希望どおりに動作させるのに問題があるので、コミュニティの誰かがこれに対する解決策を持っていることを願っています。

私が持っているのは、主要部分が0から100の値を持つトラックバーである非常に基本的なアプリケーションです。ユーザーはトラックの値を設定して、プログラムが到達する時点で「実行する作業の量」を表します一部のデバイスは、「x」量の作業を行うように指示します (x はトラックバーの値です)。そのため、トラック バーのスクロール イベントを使用して、トラック バーの値が変更されたときにキャッチし、ハンドラー内でデバイスを呼び出して、どれだけの作業を行うかを伝えます。

私の問題は、トラック バーが現在存在する場所と終了する場所の間の各値に対してイベント ハンドラーが呼び出されることです。したがって、10 から 30 にスライドすると、イベント ハンドラーが 20 回呼び出されます。これは、デバイスに手を差し伸べて、実行したくない値で実行するように指示していることを意味します。最終的な値を確認できるように、スクロールが停止したときにのみイベントを行う方法はありますか?

4

8 に答える 8

5

ユーザーがトラック バーをクリックした場合は、変数を確認するだけです。その場合は、出力を遅らせます。

bool clicked = false;
trackBar1.Scroll += (s,
                        e) =>
{
    if (clicked)
        return;
    Console.WriteLine(trackBar1.Value);
};
trackBar1.MouseDown += (s,
                        e) =>
{
    clicked = true;
};
trackBar1.MouseUp += (s,
                        e) =>
{
    if (!clicked)
        return;

    clicked = false;
    Console.WriteLine(trackBar1.Value);
};

@roken が言及した問題については、LargeChangeSmallChangeを 0 に設定できます。

于 2012-02-10T00:30:32.110 に答える
3

イベントを試すMouseCaptureChanged- それがこのタスクに最適です

于 2016-09-05T15:20:07.333 に答える
1

ユーザーは、トラック バーを短時間に複数回移動したり、トラックを複数回クリックして、つまみをドラッグする代わりにつまみをインクリメントしたりすることもできます。すべては、「サム ムーブ」の最後に登録される値が実際にはユーザーが望む最終的な値ではないという追加のケースです。

変更を確認するためのボタンが必要なようです。これにより、トラックバーの現在の値がキャプチャされ、デバイスに送信されます。

于 2012-02-10T00:32:34.007 に答える
0

これを行うためのかなり信頼できる方法は、trackbar.Scroll イベントに接続されたタイマーを使用することです。

private Timer _scrollingTimer = null;

private void trackbar_Scroll(object sender, EventArgs e)
{
    if (_scrollingTimer == null)
    {
        // Will tick every 500ms (change as required)
        _scrollingTimer = new Timer() 
        {
                Enabled = false,
                Interval = 500,
                Tag = (sender as TrackBar).Value
        };
        _scrollingTimer.Tick += (s, ea) =>
        {
            // check to see if the value has changed since we last ticked
            if (trackBar.Value == (int)_scrollingTimer.Tag)
            {
                // scrolling has stopped so we are good to go ahead and do stuff
                _scrollingTimer.Stop();

                // Do Stuff Here . . .

                _scrollingTimer.Dispose();
                _scrollingTimer = null;
            }
            else
            {
                // record the last value seen
                _scrollingTimer.Tag = trackBar.Value;
            }
        };
        _scrollingTimer.Start();
    }
}
于 2013-03-28T16:39:40.187 に答える
0

組み込みのビデオプレーヤーを実装していて、ユーザーがビデオの位置を変更できるようにしたいので、この問題が発生しましたが、毎回 SetPosition 呼び出しを送信してビデオ再生 API をオーバーロードしたくありませんでした。最終目的地に向かう途中で通過したユーザーにチェックマークを付けます。

これが私の解決策です:

まず、矢印キーが問題です。タイマーまたはその他のメカニズムを介して矢印キーを処理するために最善を尽くすことができますが、価値があるよりも苦痛であることがわかりました. したがって、@Matthias が述べたように、プロパティ SmallChange と LargeChange を 0 に設定します。

マウス入力の場合、ユーザーはクリックして移動し、離す必要があるため、トラックバーの MouseDown、MouseUp、および Scroll イベントを次のように処理します。

    private bool trackbarMouseDown = false;
    private bool trackbarScrolling = false;

    private void trackbarCurrentPosition_Scroll(object sender, EventArgs e)
    {
        trackbarScrolling = true;
    }

    private void trackbarCurrentPosition_MouseUp(object sender, MouseEventArgs e)
    {
        if (trackbarMouseDown == true && trackbarScrolling == true)
            Playback.SetPosition(trackbarCurrentPosition.Value);
        trackbarMouseDown = false;
        trackbarScrolling = false;
    }

    private void trackbarCurrentPosition_MouseDown(object sender, MouseEventArgs e)
    {
        trackbarMouseDown = true;
    }
于 2013-04-22T18:22:24.443 に答える
0

同様の問題がありましたが、範囲のトラックバー コントロールのみでした。これにも同じ考え方が当てはまりますが、この場合の方が簡単です。

必要な手順を開始するために、TrackBar で MouseUp イベントを処理しましたが、これはユーザーがマウス ボタンを離した後でのみ行いました。これは、バーを目的の位置にドラッグするか、クリックするだけで機能します。

private void rangeTrackBarControl1_MouseUp(オブジェクト送信者、System.Windows.Forms.MouseEventArgs e) { YourProcedureHere(); }

于 2014-12-04T13:35:49.910 に答える