TrackbarでのトリガーイベントはValueChangedですが、コードではありません

StackOverflow https://stackoverflow.com/questions/3506840

質問

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

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

役に立ちましたか?

解決

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

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

これを行った場合、私が考えることができるアイデアは、値を変更する前にsuspendChangedEventsプロパティを設定し、その後リセットすることです。 。

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;

他のヒント

ValueChangedの代わりにスクロールイベントを使用できます、このイベント それだけ ユーザーがスライダーをドラッグするか、キーを使用してその値を移動すると発射され、コードからの変更が発生しません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top