Trackbar有明显不固定的bug?

时间:2017-12-04 21:31:12

标签: .net trackbar

当我向表单添加轨道栏并设置

    Me.TrackBar1.Minimum = 0
    Me.TrackBar1.Maximum = 100
    Me.TrackBar1.LargeChange = 10
    Me.TrackBar1.SmallChange = 10
    Me.TrackBar1.TickFrequency = 10

......轨道栏去了berzerk:

我可以通过拖动栏来选择任何小值。 轨迹栏不再符合10,20,30等的值。 我可以手动选择任何小值。

我通过添加以下代码确认了这一点:

Private Sub TrackBar1_ValueChanged(sender As Object, e As EventArgs) Handles TrackBar1.ValueChanged

    Me.Text = Me.TrackBar1.Value

End Sub

我是否忽略了文档中的任何内容,或者是Framework 4.6.1中的错误?

1 个答案:

答案 0 :(得分:1)

我不知道你在问题中提出了什么,但在考虑之后我终于想出了你在问什么。这是你的问题:

  

我可以通过拖动栏来选择任何小值。轨迹栏不再适用于10,20,30等值。我可以手动选择任何小值。

SmallChange的文档说:

  

当用户按下其中一个箭头键时,Value属性会根据SmallChange属性中设置的值而更改。

LargeChange的文档说:

  

当用户按下PAGE UP或PAGE DOWN键或单击滚动框两侧的轨迹栏时,Value属性会根据LargeChange属性中设置的值而更改。

您的问题已澄清

您要求使用鼠标而不是使用键盘,然后轨道栏的值不会根据指定的小的和大的更改而改变,在您的情况下为10。它实际上升/下降1,所以它变为1,2,3等等。但你希望它能分为10分,20分,30分等等。

<强>解决方案

您可以处理Scroll事件,并检查该值是否为10的倍数,如果它不执行任何操作。如果没有,请将其更改为10的倍数。

<强> VB.NET

Private Sub trackBar1_Scroll(ByVal sender As Object, ByVal e As EventArgs)
    Dim bar = CType(sender, TrackBar)
    Dim isMultipleOfTen As Boolean = bar.Value Mod bar.SmallChange = 0
    If isMultipleOfTen Then
        Return
    End If

    bar.Value = bar.SmallChange * ((bar.Value + bar.SmallChange / 2) / bar.SmallChange)
End Sub

<强> C#

private void trackBar1_Scroll(object sender, EventArgs e)
{
    var bar = (TrackBar)sender;
    bool isMultipleOfTen = bar.Value % bar.SmallChange == 0;
    if (isMultipleOfTen)
    {
        return;
    }

    bar.Value = bar.SmallChange * ((bar.Value + bar.SmallChange / 2) / bar.SmallChange);
}