イベントハンドラーをトリガーせずに、コードでトラックバーのvalueプロパティを変更できるようにしたい。ユーザーがスライダーをドラッグするか、キーボードでコントロールを変更した場合にのみ、イベントをトリガーしたいと思います。これを達成する最も簡単な方法は何ですか?
トラックバーが6つあり、変更するトラックバーに応じて3つの値を変更したいと思います。問題は、これらのトラックバーの値を変更すると、ValueChangedイベントがトリガーされることです。
イベントハンドラーをトリガーせずに、コードでトラックバーのvalueプロパティを変更できるようにしたい。ユーザーがスライダーをドラッグするか、キーボードでコントロールを変更した場合にのみ、イベントをトリガーしたいと思います。これを達成する最も簡単な方法は何ですか?
トラックバーが6つあり、変更するトラックバーに応じて3つの値を変更したいと思います。問題は、これらのトラックバーの値を変更すると、ValueChangedイベントがトリガーされることです。
ValueChangedの代わりにScrollイベントを使用できます。このイベントは、ユーザーがスライダーをドラッグするか、キーを使用して値を移動した場合にのみ発生し、コードから行った変更では発生しません。
これを行う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;