跟踪栏仅在最终值上触发事件而不是时间值更改

时间:2012-02-09 23:39:28

标签: c# visual-studio-2010 trackbar

我正在开发一个非常基本的C#visual studio表单应用程序但是我遇到了一些问题,因为我希望它可以让跟踪栏按照我的意愿行事,所以希望社区中有人可以为此提供解决方案。

我所拥有的是一个非常基本的应用程序,主要部分是一个值为0到100的轨迹栏。用户设置轨道的值来表示“要执行的工作量”,此时程序伸出一些设备并告诉他们做“x”工作量(x是轨迹栏的值)。所以我所做的就是使用轨迹栏滚动事件来捕捉轨迹栏值的变化,并在处理程序内部调用设备并告诉他们要做多少工作。

我的问题是我的事件处理程序是为跟踪栏当前所在的位置和结束位置之间的每个值调用的。因此,如果它从10滑动到30,我的事件处理程序被调用20次,这意味着我伸出我的设备并告诉他们运行我甚至不希望它们运行的​​值。滚动停止发生时,是否只有事件才能检查最终值?

7 个答案:

答案 0 :(得分:5)

如果用户点击了跟踪栏,只需检查变量即可。如果是这样,请延迟输出。

bool clicked = false;
trackBar1.Scroll += (s,
                        e) =>
{
    if (clicked)
        return;
    Console.WriteLine(trackBar1.Value);
};
trackBar1.MouseDown += (s,
                        e) =>
{
    clicked = true;
};
trackBar1.MouseUp += (s,
                        e) =>
{
    if (!clicked)
        return;

    clicked = false;
    Console.WriteLine(trackBar1.Value);
};

对于提到的@roken问题,您可以将LargeChangeSmallChange设置为0。

答案 1 :(得分:2)

尝试"unexpected INTERVAL (interval) in the if statement"事件 - 这是此任务的最佳选择

答案 2 :(得分:1)

用户还可以在短时间内多次移动轨迹栏,或多次单击轨道以增大拇指而不是拖动拇指。所有这些都是其他情况,其中在“拇指移动”结束时注册的值实际上不是您的用户所希望的最终值。

听起来您需要一个确认更改的按钮,然后捕获轨道栏的当前值并将其发送到您的设备。

答案 3 :(得分:1)

我发现一个相当可靠的方法是使用连接在trackbar.Scroll事件中的计时器:

private Timer _scrollingTimer = null;

private void trackbar_Scroll(object sender, EventArgs e)
{
    if (_scrollingTimer == null)
    {
        // Will tick every 500ms (change as required)
        _scrollingTimer = new Timer() 
        {
                Enabled = false,
                Interval = 500,
                Tag = (sender as TrackBar).Value
        };
        _scrollingTimer.Tick += (s, ea) =>
        {
            // check to see if the value has changed since we last ticked
            if (trackBar.Value == (int)_scrollingTimer.Tag)
            {
                // scrolling has stopped so we are good to go ahead and do stuff
                _scrollingTimer.Stop();

                // Do Stuff Here . . .

                _scrollingTimer.Dispose();
                _scrollingTimer = null;
            }
            else
            {
                // record the last value seen
                _scrollingTimer.Tag = trackBar.Value;
            }
        };
        _scrollingTimer.Start();
    }
}

答案 4 :(得分:0)

使用trackbar_valuechanged事件处理程序:

尝试此操作
trackbar_valuechanged(s,e) {
    if(trackbar.value == 10){
        //Do whatever you want
    } else{
        //Do nothing or something else
    }
}

答案 5 :(得分:0)

我刚才遇到这个问题,因为我正在实施一个内置的视频播放器,并希望用户能够改变视频的位置,但我不想通过发送它来重载视频播放API SetPosition要求用户在前往他/她的最终目的地途中传递的每个蜱虫。

这是我的解决方案:

首先,箭头键​​是个问题。您可以尝试通过计时器或其他机制处理箭头键,但我发现它比它的价值更痛苦。因此,当@Matthias提到时,将属性SmallChange和LargeChange设置为0。

对于鼠标输入,用户将不得不点击,移动它,然后放手,以便像这样处理MouseDown,MouseUp和轨迹栏的Scroll事件:

    private bool trackbarMouseDown = false;
    private bool trackbarScrolling = false;

    private void trackbarCurrentPosition_Scroll(object sender, EventArgs e)
    {
        trackbarScrolling = true;
    }

    private void trackbarCurrentPosition_MouseUp(object sender, MouseEventArgs e)
    {
        if (trackbarMouseDown == true && trackbarScrolling == true)
            Playback.SetPosition(trackbarCurrentPosition.Value);
        trackbarMouseDown = false;
        trackbarScrolling = false;
    }

    private void trackbarCurrentPosition_MouseDown(object sender, MouseEventArgs e)
    {
        trackbarMouseDown = true;
    }

答案 6 :(得分:0)

我遇到了类似的问题,只有一个范围的TrackBar Control。同样的想法也适用于此,只有这种情况更容易。

我处理了TrackBar上的MouseUp事件以启动我需要的程序,只有在你放开鼠标按钮之后。如果您将条拖动到所需位置或只是单击它,则此方法有效。

private void rangeTrackBarControl1_MouseUp(object sender,System.Windows.Forms.MouseEventArgs e)         {             YourProcedureHere();         }