如何在Thread中移动按钮

时间:2011-03-09 21:57:33

标签: c# multithreading button move

我需要在线程中移动按钮,而不是按一个按钮,我的按钮向右移动直到它到达表格的末尾。 Y是永久性的。
这就是我现在所拥有的代码:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void button2_Click(object sender, EventArgs e)
    {
        Thread thr = new Thread(Go);
        thr.Start();          
    }

    private delegate void moveBd(Button btn);
    void moveButton(Button btn)
    {
        int x = btn.Location.X;
        int y = btn.Location.Y;
        btn.Location = new Point(x + 1, y);
    }

    private void Go()
    {
        Invoke(new moveBd(moveButton), button1);
    }

}

当我点击button1时,仅向右移动1个(每个单元右侧)。但我需要它不停地移动。 有人能帮助我吗? 感谢名单。

3 个答案:

答案 0 :(得分:3)

建议

您可能希望使用Timer来执行此操作。

在表单中添加Timer控件,并使用Timer_Tick事件将按钮移到右侧。

使用Timer的Enabled属性启动和停止按钮。

答案

如果您坚持使用线程,则需要在Go方法中添加一个循环:

private void Go()
{
    while (btn.Location.X < this.Size.Width - btn.Size.Width)
    {
        Invoke(new moveBd(moveButton), button1);
        Thread.Sleep(100);
    }
}

答案 1 :(得分:2)

您必须在Go方法中放置一个循环,以便它继续移动按钮。

但是,使用线程不是最佳选择。您应该尝试使用Timer控件。这是以间隔执行代码而不是循环执行代码的更好方法,它将在主线程中运行事件,因此您无需使用Invoke来访问控件。

答案 2 :(得分:1)

你需要在Go()方法中使用循环。

private void Go()
{
    while ((button1.Location.X + button1.Size.Width) < this.Size.Width)
    {
        Invoke(new moveBd(moveButton), button1);
        Thread.Sleep(50);
    }
}