1

(注意:我知道有一个相关的 Q+A,但它与计时器结束有关,而我的与滴答声有关)

此代码用于为在 2 点之间移动的矩形设置动画。目前,第一个动作是完美的,但之后每次调用动画都会变得越来越快。

我认为这是由于我对如何在每个刻度上调用矩形移动存在误解。

任何帮助将不胜感激!

本节启动计时器:

        if (floorNo == 2)
        {
            timerDown.Tick += new EventHandler(timer_LiftDown);
            timerDown.Interval = 10;
            timerDown.Enabled = true;
            timerDown.Start();
        }

在每个刻度上调用此代码(对吗?):

    void timer_LiftDown(object sender, EventArgs e)
    {
        rectangle1.Location = new Point(192, rectangle1.Location.Y + 2);
        if (rectangle1.Location.Y >= 196)
        {
            timerDown.Stop();
        }
    }

我已经删除了一些不相关的代码(例如用当前状态更新文本框,更改 floorNo 变量等)。

谢谢你。

4

2 回答 2

3

您正在添加一个事件处理程序,但没有删除它。因此,每次调用动画时,都会添加另一个处理程序。因此,每个滴答都会被处理两次并导致动画加速。

您需要添加

timerDown.Tick -= new EventHandler(Timer_LiftDown);

在您的代码中的某个时刻。不幸的是,从您提供的代码段中,尚不清楚可以在哪里安全地添加它。

于 2012-12-06T17:44:50.070 回答
3

我建议不要每次都订阅和取消订阅事件,而是建议设置一次计时器,然后只调用它的启动/停止。

//Somewhere in a load event...
timerDown.Tick += new EventHandler(timer_LiftDown);
timerDown.Interval = 10;
timerDown.Enabled = true;

//More code...

if (floorNo == 2)
{
    timerDown.Start();
}

//More code...

void timer_LiftDown(object sender, EventArgs e)
{
    rectangle1.Location = new Point(192, rectangle1.Location.Y + 2);
    if (rectangle1.Location.Y >= 196)
    {
        timerDown.Stop();
    }
}

这样,您只需初始化计时器并设置一次间隔,即可随意启动/停止。

于 2012-12-06T17:49:24.457 回答