C# - 加载后移动表单

时间:2011-07-18 18:14:40

标签: c# winforms

我有两种形式。在主要形式中,我有一个按钮,它调用另一种形式的构造函数。在加载表单后,我需要它自动调用一个函数,它将在某个方向上移动这个表单。我很难找到能完成这项工作的事件,因为在表格实际“显示”之前执行了加载或显示等事件......这意味着移动表格的循环比表格形式更早完成并且表格显示在最终位置。表格可见后,是否有人知道事件被触发?或者知道这个问题的另一个解决方案?

关于另一个话题我已经读过关于已显示的事件,但不幸的是它的行为与Load事件相同,我不明白为什么:(只有一个解决方案,我记住它创建第二个线程,延迟500ms(这应该足够load form)将启动move()metod,但我不知道如何调用在不同线程上创建的函数:( ...线程将与move()metod同时结束。

名为Title的第二种形式:

public partial class Title : Form
{

    public Title()
    {
        InitializeComponent();
        this.Left = (Screen.AllScreens[0].Bounds.Width + Screen.AllScreens[1].Bounds.Width / 2 - this.Width / 2);
        this.Top = (Screen.AllScreens[1].Bounds.Height-80);        


    }

    // metod moves form
    public void move() 
    {

        while (this.Top > 400)
        {
            this.Top--;
            Thread.Sleep(1);
        }
    }

    // another button closes this form with reverse move animation - this works fine
    public void Destruct()  
    {
        while (this.Top < (Screen.AllScreens[1].Bounds.Height - 80))
        {
            this.Top++;
            Thread.Sleep(1);

        }
        this.Close();
    }

    private void Title_Shown(object sender, EventArgs e)
    {
        move();
    }


}

[溶液] 我在循环中使用了Windows.Timer而不是Thread.Sleep()。

1 个答案:

答案 0 :(得分:2)

看来你打算创造某种慢速飞行效果。 我建议您使用计时器而不是使用Thread.Sleep()循环。 您可以在活动中创建和启用计时器。 在计时器的每个滴答之后,您可以稍微移动窗口。 到达结束位置后,您只需禁用计时器(Enabled = false)。 您可以使用工具箱中的计时器控件。