Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用定时器移动对象_C#_Winforms_Timer - Fatal编程技术网

C# 用定时器移动对象

C# 用定时器移动对象,c#,winforms,timer,C#,Winforms,Timer,我有一个物体在一个形状中有一个对角线运动,初始位置是中心,当物体在形状的角上时,我想停止运动,然后将运动返回到初始位置,谢谢你的帮助,我有了第一个运动,但我现在不知道如何返回 public void functionThread() { var timer2 = new Timer(); timer2.Interval = 50; timer2.Enabled = true; timer2.Tick += (s, e) => panel1.Location = n

我有一个物体在一个形状中有一个对角线运动,初始位置是中心,当物体在形状的角上时,我想停止运动,然后将运动返回到初始位置,谢谢你的帮助,我有了第一个运动,但我现在不知道如何返回

public void functionThread()
{
   var timer2 = new Timer();
   timer2.Interval = 50;
   timer2.Enabled = true;

   timer2.Tick += (s, e) => panel1.Location = new Point(panel1.Location.X - 5, panel1.Location.Y - 5);
}

此代码使面板从左向右移动,其起始位置为10,10(
基点
),当面板到达边缘时,它将使面板后退,以便再次移动。您也可以在点击此bool后停止计时器,唯一的更改是全局声明计时器,答案如下:


timer2
声明移出您的函数并放入表单,如下所示:

public partial class Form1 : Form
{
    System.Windows.Forms.Timer timer2 = new System.Windows.Forms.Timer();

    public Form1()
    {
    }
函数线程中
勾选事件生成方法,使代码更易于阅读和维护

timer2.Tick += Timer2_Tick; 
Timer2\u勾选
方法中,检查面板的位置,必要时停止计时器

private void Timer2_Tick(object sender, EventArgs e)
{
    if (panel1.Left == 0 || panel1.Top == 0)
    {
        timer2.Stop();
    }
    else
        panel1.Location = new Point(panel1.Location.X - 5, panel1.Location.Y - 5);
}

首先确保您使用的是
System.Windows.Forms.Timer
。很难从ExampleThreading中判断。计时器可以这样声明。WPF已经有了。在最简单的形式中,您可以指定元素的属性在一段时间内从一个值变化到另一个值。在最复杂的情况下,可以指定多个transitions@EpicKip这正是我的观点。您不应该在WinForms应用程序的UI线程上使用
Threading.Timer
,如果要执行动画,请不要使用WinForms。通过计时器更改坐标会导致CPU负载高、运动不平稳和更新缓慢。如果屏幕上有很多元素需要重新绘制,那么性能可能会非常差。他必须返回起始位置,但从未说过计时器必须返回stop@EpicKip“我想停止移动”-这意味着计时器应该停止,以便对操作系统友好。这是一个安全问题efficiency@MickyD“将运动恢复到初始位置”@EpicKip,你想让计时器仅仅为了它而运行吗?@MickyD如果我将运动恢复到初始位置,听起来你想让它从那里再次移动。这就是为什么。否则它不应该是“返回运动”,这是正确的解决方案,它可能对OP有用(或者,事实上,它可能是OP要求的解决方案)。因此不需要下一票。表单不会处理该计时器,因为它没有在表单作用域中声明。@LarsTech Happy?:)
private void Timer2_Tick(object sender, EventArgs e)
{
    if (panel1.Left == 0 || panel1.Top == 0)
    {
        timer2.Stop();
    }
    else
        panel1.Location = new Point(panel1.Location.X - 5, panel1.Location.Y - 5);
}