3

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

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

4

2 回答 2

5

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

于 2015-05-29T19:11:56.257 回答
3

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

或者,您可以创建自己的自定义 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;
于 2010-08-22T11:23:49.547 回答