Инициировать событие на трекбаре ValueChanged, но не в коде

Я хочу иметь возможность изменять свойство value трекбара в коде, не вызывая обработчик событий. Я хочу инициировать событие только тогда, когда пользователь изменяет элемент управления, перетаскивая ползунок или перемещая его с помощью клавиатуры. Каков самый простой способ добиться этого?

У меня есть 6 трекбаров, и я хочу изменить значение 3 из них в зависимости от того, какой трекбар изменен. Проблема в том, что изменение значения этих трекбаров вызовет их события ValueChanged.


person Matt Esch    schedule 17.08.2010    source источник


Ответы (2)


Один из способов сделать это — временно удалить обработчики событий перед изменением значений в коде, а затем повторно подключить их после этого, хотя это не кажется слишком элегантным.

В качестве альтернативы вы можете создать свой собственный класс 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;
person Andy    schedule 22.08.2010

Вы можете использовать событие Scroll вместо ValueChanged, это событие только запускается, когда пользователь перетаскивает ползунок или использует клавиши для перемещения его значения, и изменения, которые вы вносите в код, не вызывают его .

person Fernando Valenzuela    schedule 29.05.2015