【问题标题】:Trigger event on trackbar ValueChanged, but not in code在轨迹栏 ValueChanged 上触发事件,但不在代码中
【发布时间】:2011-03-31 05:28:12
【问题描述】:

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

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

【问题讨论】:

    标签: c# event-handling gdi+ trackbar


    【解决方案1】:

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

    【讨论】:

      【解决方案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;
      

      【讨论】:

        猜你喜欢
        • 2020-08-08
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多