C# 如何在计时器中使用键事件?

C# 如何在计时器中使用键事件?,c#,timer,C#,Timer,我有下面的代码,它在按键时开始将两个标签从窗体的顶部移动到底部,到达窗体的底部后,它停止。我已经用定时器完成了。这是密码 private void Form1_KeyPress(object sender, KeyPressEventArgs e) { label1.Text = "Key Pressed: " + e.KeyChar; //animate(sender, e); timer1.Start(); } private void timer1_Tick(obj

我有下面的代码,它在按键时开始将两个标签从窗体的顶部移动到底部,到达窗体的底部后,它停止。我已经用定时器完成了。这是密码

private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
    label1.Text = "Key Pressed: " + e.KeyChar;
   //animate(sender, e);
    timer1.Start();
}

private void timer1_Tick(object sender, EventArgs e)
{
    Random random = new Random();
    int X = random.Next(0, 1230);
    int y = X;
    label2.Location = new Point(X, 5);
    label3.Location = new Point(X + 20, 5 + 20);
    for (int i = 5; i <= 470; i++)
    {
        label2.Location = new Point(y, i);
        label3.Location = new Point(y + 20, i + 20);
        Thread.Sleep(1);
    }
    timer1.Stop();
}
private void Form1\u按键(对象发送方,按键事件参数e)
{
label1.Text=“按键:”+e.KeyChar;
//制作动画(发送者,e);
timer1.Start();
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
随机=新随机();
intx=random.Next(01230);
int y=X;
标签2.位置=新点(X,5);
标签3.位置=新点(X+20,5+20);
对于(inti=5;i尝试一下它是如此简单

Public Boolean tick = false;
private void Form1_KeyPress(object sender, KeyPressEventArgs e)
{
tick = !tick;
    label1.Text = "Key Pressed: " + e.KeyChar;
   //animate(sender, e);
if(tick)
    timer1.Start();
else
    timer1.Stop();
}

首先,我建议您使用keyDown和keyUp事件,而不是按键。要解决您的问题,只需在keyDown上设置bool=true,在keyUp上设置bool=false。现在,您可以在勾选方法中检查bool,如果检测到按键被按下,您可以执行任何操作。

这里的问题是您没有真正使用e
定时器
的使用方式。理想情况下,每次触发定时器
的勾号事件时,您都会有一个事件进行更改

在这里,您将侦听事件并执行几轮处理,而不会从处理程序返回,此时您将停止计时器。这意味着代码将只处理滴答事件一次,而不是N次


若要解决此问题,请尝试将处理程序拆分为每勾号执行一次增量工作,并且仅在绘图完成后停止。这还将允许您处理勾号事件之间的关键事件并停止计时器。拆分工作的最佳位置是在
线程.Sleep
调用(该调用本身不应出现在处理程序中)

@user3206911您是否检查了此问题?我按照您的建议执行了此操作,似乎上下事件都应该完成此操作。现在我已删除线程。睡眠(1);语句,并用布尔值检查替换它,它就工作了。但问题是,现在标签以非常快的速度落下,几乎不可能看到它们所代表的文本。我使用了Thread.Sleep(1)对于控制睡眠的每次迭代。是否有其他方法可以减慢此速度?@user3206911按照其他答案中的建议正确使用计时器。计时器用于每x ms进行一次常规操作。在您的情况下,每个勾号-如果(bool)转换为dX(或dY)else-不做任何事情-。并为您希望移动的速度(或dX/dY)设置计时器的勾号频率(如果我理解正确的话)谢谢JaredPar。问题是现在标签以非常快的速度掉落,几乎不可能看到它们所代表的文本。我使用了Thread.Sleep(1)对于控制睡眠的每次迭代。是否有其他方法可以降低此速度?@user3206911尝试在
计时器上增加持续时间。使两次滴答之间的时间间隔至少为一秒。如果只移动票据上的标签,则两次移动之间的时间间隔也至少为一秒