C# 动画卡住程序

标签 c# winforms animation

由于某种原因,这会卡住程序:

private void Form1_Shown(object sender, EventArgs e)
{
    int x = 1;
    var frame1 = pictureBox2.BackgroundImage;
    var frame2 = pictureBox3.BackgroundImage;
    while(x < 2)
    {
        pictureBox1.BackgroundImage = frame1;
        pictureBox1.BackgroundImage = frame2;
    }
}

为什么?
pictureBox2 包含第一帧,pictureBox3 包含第二帧。
pictureBox1 包含“动画”。 (如代码所示)

编辑:我不希望它一次动画,我希望它永远动画。

最佳答案

这是一种方法...

使用async标记您的Shown()事件,然后在帧之间使用await Task.Delay():

    private async void Form1_Shown(object sender, EventArgs e)
    {
        bool first = true;
        var frame1 = pictureBox2.BackgroundImage;
        var frame2 = pictureBox3.BackgroundImage;
        while (true)
        {
            pictureBox1.BackgroundImage = first ? frame1 : frame2;
            first = !first;
            await Task.Delay(500); // 1/2 second delay <-- set it to your desired delay between frames
        }
    }

---------- 编辑 ----------

使用计时器和 IEnumerator 的替代方法。如果您有不止两个框架,这将是一个好方法:

    private IEnumerator<Image> frames;
    private System.Windows.Forms.Timer tmr;

    private void Form1_Shown(object sender, EventArgs e)
    {
        List<Image> lstFrames = new List<Image>();
        lstFrames.Add(pictureBox2.BackgroundImage);
        lstFrames.Add(pictureBox3.BackgroundImage);
        lstFrames.Add(pictureBox4.BackgroundImage);
        // etc...
        frames = lstFrames.GetEnumerator();
        DisplayNextFrame();

        tmr = new System.Windows.Forms.Timer();
        tmr.Interval = 500;
        tmr.Tick += Tmr_Tick;
        tmr.Start();
    }

    private void Tmr_Tick(object sender, EventArgs e)
    {
        DisplayNextFrame();
    }

    private void DisplayNextFrame()
    {
        if (!frames.MoveNext())
        {
            frames.Reset();
            frames.MoveNext();
        }
        pictureBox1.BackgroundImage = frames.Current;
    }

关于C# 动画卡住程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31667668/

相关文章:

c# - 将字符串转换为 DateTime 变量?

c# - 寻找在调试器中获取对象实例的方法的工具?

javascript - 如何在图像经过页面上的某个点时更改图像,然后在高于该点时将其更改回来?

C#:无法检查类型是否为数组

c# - Entity Framework : foreign keys for many-to-many relations

c# - 获取winforms文本框的光标位置

vb.net - VB .Net 我可以有效地管理组框内的所有事件吗?

c# - 如何自定义 PropertyGrid 对象的 Collection Editor 中的描述?

javascript - 如何将动画 div 限制到其父 div

android - android中如何在ViewPager上实现立方体Transition效果动画?