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

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

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

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

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

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

您可以使用Scroll事件而不是ValueChanged, 只有当用户拖动滑块或使用键移动其值时才会触发此事件,并且您从代码中所做的更改不会触发它。