如何使用鼠标按住并释放来检查TrackBar的滑动。

| 我的WinForms程序中有一个跟踪栏,通过移动它,可以刷新一个庞大且耗时的方法。看一下这段代码:
trackBar_ValueChanged(object sender, EventArgs e)
{
     this.RefreshData();
}
该轨迹栏有20个步骤。如果在我的情况下,如果用户抓住轨迹栏的滑块并将其从20拉到0,则虽然'RefreshData \'会在结束值为''RefreshData \'的过程时显示正确的数据,但将执行20次。 ,我想做一些类似的事情,即在释放trackBar滑块后仅调用\'RefreshData \',这样它就不会处理到轨迹栏上释放点的所有步骤。 任何帮助和技巧,以实现这一目标将不胜枚举! 谢谢。     
已邀请:
我之前做这种事情的方式是使用计时器。每次TrackBar的值更改时,请重置计时器,以使其在500毫秒内触发(或任何适合您的时间)。如果用户在计时器启动之前更改了该值,它将再次重置,这意味着即使多次更改,计时器也只会启动一次。 在这里唯一需要注意的是,计时器将在其他线程上触发,并且您将无法从该线程更新UI,因此您必须重新调用UI线程才能在该线程上进行更改。也就是说,如果您可以将大部分昂贵的工作移至该后台线程,则可以使UI响应时间更长。 这是一些示例代码,应该使您对我的意思有所了解。
public partial class Form1 : Form
{
    private int updateCount;
    private System.Threading.Timer timer;

    public Form1()
    {
        this.InitializeComponent();
        this.timer = new System.Threading.Timer(this.UpdateValue);
    }

    private void UpdateValue(object state)
    {
        // Prevent the user from changing the value while we\'re doing
        // our expensive operation
        this.Invoke(new MethodInvoker(() => this.trackBar1.Enabled = false));

        // Do the expensive updates - this is still on a background thread
        this.updateCount++;

        this.Invoke(new MethodInvoker(this.UpdateUI));
    }

    private void UpdateUI()
    {
        this.label1.Text = this.updateCount.ToString();

        // Re-enable the track bar again
        this.trackBar1.Enabled = true;
    }

    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
        this.timer.Change(TimeSpan.FromMilliseconds(500), new TimeSpan(-1));
    }
}
编辑:这是一个使用获胜表格计时器进行计时的解决方案。区别在于,您将在计算运行时锁定UI;根据您的情况,这可能会也可能不会。
public partial class Form1 : Form
{
    private int updateCount;
    private Timer timer;

    public Form1()
    {
        this.InitializeComponent();

        this.timer = new Timer();
        this.timer.Interval = 500;
        this.timer.Tick += this.Timer_Tick;
    }

    private void Timer_Tick(object sender, EventArgs e)
    {
        this.timer.Stop();

        this.updateCount++;
        this.label1.Text = this.updateCount.ToString();
    }

    private void trackBar1_ValueChanged(object sender, EventArgs e)
    {
        this.timer.Stop();
        this.timer.Start();
    }
}
    
怎么样:
Boolean user_done_updating = false;

private void MytrackBar_ValueChanged(object sender, EventArgs e)
{
    user_done_updating = true;
}

private void MytrackBar_MouseUp(object sender, MouseEventArgs e)
{
    if (user_done_updating)
    {
        user_done_updating = false;
        //Do Stuff
    }
}
    
考虑在新线程中执行长时间运行的方法。维护对该线程的引用,并在重新启动该线程之前调用Thread.Abort()。     
尝试
KeyUp
事件: http://msdn.microsoft.com/zh-CN/library/system.windows.forms.control.keyup.aspx     

要回复问题请先登录注册