Инициирующее событие на трекбаре ValueChanged, но не в коде - PullRequest
3 голосов
/ 18 августа 2010

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

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

Ответы [ 2 ]

4 голосов
/ 29 мая 2015

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

2 голосов
/ 22 августа 2010

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

В качестве альтернативы вы можете создать свой собственный класс TrackBar, который наследуется от 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;
...