在windowsForms中循环更新

时间:2016-06-05 06:25:18

标签: c#

我想创建一个动画移动物体..为了移动这个物体我需要更新坐标x和y或其中一个,问题是物体是柱子到最终位置没有平滑移动动画假设...我使用线程睡眠,但不只是让代码冻结然后对象jamb ..这是代码的不工作部分

public void t_Tick(object sender, EventArgs e)
{
    if (flag)
    {
        for (int i = 0; i < 100; i = i + 1)
        {
            x-position = x-position + 3;
            Invalidate();
            Thread.Sleep(5000);//instead of stop for 5 second and continue the loop is stop 5 second and go to i=100 the final value in the loop
        }
        flag = false;
    }
}

2 个答案:

答案 0 :(得分:1)

问自己这个问题:

  

我希望我的代码每t.Interval毫秒执行一次?

答案是

  

移动Control一次。

因此,只需在t_Tick方法中移动一次。

您认为我的答案是错误的,因为没有for循环,但计时器中包含一个循环。在Timer类中,有一些代码可以做这样的事情:

while (true) {
  form1.t_Tick(...);
  Thread.Sleep(Interval);
}

注意:这不是Timer代码中的真实代码,它只是为了解释计时器背后的概念。

那么您当前的代码是做什么的?

它完全按照您希望的方式移动,但是Thread.Sleep()会阻塞您所在的线程而没有其他任何操作,就像您在该行代码上有一个调试断点一样。因此,可能会调用Invalidate(),但在您离开for循环(完全移动时)之前,不会调用重新绘制表单的代码。

答案 1 :(得分:0)

尝试使用Refresh()代替Invalidate()来强制立即绘制控件。通过调用Invalidate(),你基本上只是告诉控件,它的一些部分(或所有部分)需要重新绘制,但现在不要这样做。请注意,这不是一个好方法,因为调用Thread.Sleep会导致UI线程被阻止。

有关类似问题及其答案,请参阅here,其中使用了更为规范的方式。