【问题标题】:How to start from the second or third tick in TrackBar?如何从 TrackBar 中的第二个或第三个刻度开始?
【发布时间】:2016-11-07 17:46:49
【问题描述】:

我正在尝试在代码中应用公式。但是,除非我更改 TrackBar 的起始刻度(不更改我的最小刻度值),否则此公式将不起作用。

例如:

TRmin = 1 
Trmax = 10 

我需要从23开始,而不是从1开始

【问题讨论】:

  • 你到底在说什么?我们应该知道这一切意味着什么吗?
  • 嘿@roryap 如果这让您感到困惑,我很抱歉。我正在研究需要更改轨迹栏的星号刻度值的东西。例如,我有最小值 = 1 最大值 = 10 和我的频率 = 1 的轨迹栏,所以轨迹栏有 10 个刻度(或 10 个变化点)我想要的是如何从 2 或 3 点开始没有更改最小值
  • 您是否考虑过在您的公式中使用Math.Min(trackBar.Value, 2)?或者您想阻止用户将轨迹栏移动到低于 2 或 3 的值? (请选择其中一个值或说明它是如何确定的。)
  • 不,我没有使用它Math.Min(trackBar.Value, 2)。但是就像你说的我想阻止用户将任务栏移动到低于 2 或 3 的值
  • @VisualVincent 我对“属性已更改”部分的设计器属性事件窗格中未出现 ValueChanged 事件感到困惑。尽管一旦代码中有处理程序,它就会出现在 Behavior->Load 下的属性属性窗格中。我认为在 ValueChanged 处理程序中更改值可能会有一些问题。一项快速测试表明,有时处理程序会被多次调用。我已经编辑了我的答案。

标签: vb.net


【解决方案1】:

你可以使用TrackBar.Scroll event来限制值:

Option Strict On
Option Infer On
' ...
Private Sub TrackBar1_Scroll(sender As Object, e As EventArgs) Handles TrackBar1.Scroll
    Dim tb = DirectCast(sender, TrackBar)
    tb.Value = Math.Max(3, tb.Value)
    lbTrackBar1Value.Text = tb.Value.ToString()
    lbResult.Text = Calc(tb.Value).ToString()

End Sub

假设您有标签来显示轨迹栏值和某些函数Calc 的结果。

我使用了Dim tb = DirectCast(sender, TrackBar),因此更容易概括该方法以用于其他轨迹栏。

或者您可以使用TrackBar.ValueChanged Event,它的特点是如果您以编程方式设置值也会被提升,正如 Visual Vincent 所指出的那样。

如果有时在 Scroll 或 ValueChanged 事件上多次调用处理程序很重要,那么您可以防止像这样多次运行代码:

Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar1.ValueChanged
    Static inVC As Boolean = False
    If inVC Then Return
    Dim tb = DirectCast(sender, TrackBar)
    inVC = True
    tb.Value = Math.Max(3, tb.Value)
    inVC = False

End Sub

本地 static variable inVC 仅初始化一次,并在调用之间保持其值。

【讨论】:

  • 嗯,有趣的是ValueChanged 有时会被多次解雇……我想知道为什么。
  • @VisualVincent Scroll 事件也可以被多次触发。我假设您在思考为什么在处理程序中更改值时再次调用 ValueChanged 处理程序是修辞;)
  • 哦,所以你的意思只是因为你设置了Value 属性而再次调用它?我以为你的意思是有时当你改变它时,它会触发两次而不是一次。
  • @VisualVincent 是的。可以改用RemoveHandlerAddHandler,但是检查变量对计算机来说工作量要少一些,如果处理程序可以被多个事件使用,可能会更简单。当然,在某些情况下,可以多次调用处理程序并不重要。
  • @VisualVincent 我发现了一些您可能会感兴趣的相关 SO 材料:How to prevent firing CheckedChanged event when checking a control programmatically?EventHandler and Delegate misunderstanding
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-12-15
  • 2017-12-19
  • 2020-03-07
  • 1970-01-01
相关资源
最近更新 更多