3

イベントハンドラーをトリガーせずに、コードでトラックバーのvalueプロパティを変更できるようにしたい。ユーザーがスライダーをドラッグするか、キーボードでコントロールを変更した場合にのみ、イベントをトリガーしたいと思います。これを達成する最も簡単な方法は何ですか?

トラックバーが6つあり、変更するトラックバーに応じて3つの値を変更したいと思います。問題は、これらのトラックバーの値を変更すると、ValueChangedイベントがトリガーされることです。

4

2 に答える 2

5

ValueChangedの代わりにScrollイベントを使用できます。このイベントは、ユーザーがスライダーをドラッグするか、キーを使用して値を移動した場合にのみ発生し、コードから行った変更では発生しません。

于 2015-05-29T19:11:56.257 に答える
3

これを行う1つの方法は、コードの値を変更する前にイベントハンドラーを一時的に削除し、後でそれらを再アタッチすることですが、これはあまりエレガントではないようです。

または、TrackBarから継承する独自のカスタムTrackBarクラスを作成し、OnValueChanged()メソッドをオーバーライドして必要な処理を実行することもできます。

これを行った場合、私が考えることができるアイデアは、値を変更する前にSuspendChangedEventsプロパティを設定し、後でリセットすることです。これにより、「削除/接続」ハンドラー手法と同様の機能が提供されますが、ロジックはTrackBar自体にカプセル化されます。 。

public class MyTrackBar : TrackBar
{
    public bool SuspendChangedEvent
    { get; set; }

    protected override void OnValueChanged(EventArgs e)
    {
        if (!SuspendChangedEvent) base.OnValueChanged(e);
    }
}

次に、コードでこのようなことを行うことができます。

// Suspend trackbar change events
myTrackBar1.SuspendChangedEvents = true;

// Change the value
myTrackBar1.Value = 50;  // ValueChanged event will not fire.

// Turn changed events back on
myTrackBar1.SuspendChangedEvents = false;
于 2010-08-22T11:23:49.547 に答える