C# WinForms的平滑展开和折叠动画

C# WinForms的平滑展开和折叠动画,c#,winforms,C#,Winforms,我正在尝试为我的窗体获得一个平滑的展开和折叠动画。我现在的动画真的很不稳定。这是这张照片的Gif。有没有其他不冻结表单的方法 private void ShowHideToggle_CheckStateChanged(object sender, EventArgs e) { if (ShowHideToggle.Checked) //checked = expand form { ShowHideToggle.Text = "&l

我正在尝试为我的窗体获得一个平滑的展开和折叠动画。我现在的动画真的很不稳定。这是这张照片的Gif。有没有其他不冻结表单的方法

private void ShowHideToggle_CheckStateChanged(object sender, EventArgs e)
    {
        if (ShowHideToggle.Checked) //checked = expand form
        {
            ShowHideToggle.Text = "<";
            while (Width < originalWidth)
            {
                Width++;
                Application.DoEvents();
            }
        }
        else
        {
            ShowHideToggle.Text = ">";
            while(Width > 24)
            {
                Width--;
                Application.DoEvents();
            }
        }
    }
private void ShowHideToggle\u CheckStateChanged(对象发送方,事件参数e)
{
if(ShowHideToggle.Checked)//Checked=展开表单
{
ShowHideToggle.Text=“”;
而(宽度>24)
{
宽度--;
Application.DoEvents();
}
}
}

创建一个
计时器

Timer t = new Timer();
t.Interval = 14;
t.Tick += delegate
{
    if (ShowHideToggle.Checked)
    {
        if (this.Width > 30) // Set Form.MinimumSize to this otherwise the Timer will keep going, so it will permanently try to decrease the size.
            this.Width -= 10;
        else
            t.Stop();
    }
    else
    {
        if (this.Width < 300)
            this.Width += 10;
        else
            t.Stop();
    }
};

创建一个
计时器

Timer t = new Timer();
t.Interval = 14;
t.Tick += delegate
{
    if (ShowHideToggle.Checked)
    {
        if (this.Width > 30) // Set Form.MinimumSize to this otherwise the Timer will keep going, so it will permanently try to decrease the size.
            this.Width -= 10;
        else
            t.Stop();
    }
    else
    {
        if (this.Width < 300)
            this.Width += 10;
        else
            t.Stop();
    }
};

作为补充说明,您应该避免
DoEvents
…平滑。。很抱歉,动画和WinForms不能很好地结合在一起。作为补充说明,您应该避免
DoEvents
…平滑。。动画和WinForms不能很好地结合在一起,很抱歉,它有点慢。还有其他想法吗?
t.Interval=2这是一种错觉;15-25是更真实的值。增加此宽度。我更改了答案中的代码。也许我遗漏了一些东西…看起来每次单击这个东西时都会附加一个事件处理程序?是的,测试了它,并在它激活几次之后。。。所以我改了,有点慢。还有其他想法吗?
t.Interval=2这是一种错觉;15-25是更真实的值。增加此宽度。我更改了答案中的代码。也许我遗漏了一些东西…看起来每次单击这个东西时都会附加一个事件处理程序?是的,测试了它,并在它激活几次之后。。。所以我改了。