跟踪栏上的触发事件ValueChanged,但不在代码中

时间:2010-08-17 20:51:08

标签: c# event-handling gdi+ trackbar

我希望能够在代码中修改跟踪栏的value属性,而不会触发我的事件处理程序。我希望仅在用户通过拖动滑块或使用键盘移动控件来更改控件时触发事件。实现这一目标的最简单方法是什么?

我有6个轨道栏,我想根据更改的轨迹栏更改其中3个的值。问题是更改这些跟踪栏的值将触发其ValueChanged事件。

2 个答案:

答案 0 :(得分:4)

您可以使用Scroll事件而不是ValueChanged,当用户拖动滑块或使用键移动其值时,会触发此事件,并且您从代码中所做的更改将赢得&# 39;开火吧。

答案 1 :(得分:2)

你可以这样做的一种方法是在修改代码中的值之前暂时删除事件处理程序,然后再重新附加它们,虽然这看起来不太优雅。

或者,您可以创建自己的自定义TrackBar类,该类继承自TrackBar并覆盖OnValueChanged()方法以执行您想要的操作。

如果你这样做,我能想到的一个想法是在更改值之前设置SuspendChangedEvents属性,然后重置它。这将提供与'remove / attach'处理程序技术类似的功能,但逻辑被封装在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;