为啥我的图片框动画没有按预期工作(C# Windows 窗体应用程序)?

Posted

技术标签:

【中文标题】为啥我的图片框动画没有按预期工作(C# Windows 窗体应用程序)?【英文标题】:Why isn't my picturebox animation working as expected (C# Windows Form Application)?为什么我的图片框动画没有按预期工作(C# Windows 窗体应用程序)? 【发布时间】:2014-11-14 11:01:31 【问题描述】:

我正在为学校制作一个简单的记忆游戏,使用 c# 和一个 Windows 窗体应用程序。这些卡片被创建为图片框,我试图通过减少和增加图片框的宽度来动画卡片的翻转。使用 for 循环,我设法制作了一些动画,正如我所期望的那样,卡片的宽度会慢慢缩小。但是,当我尝试反转代码时,它似乎要等待整个动画持续时间,然后卡片才会弹出到全宽。

我从点击事件中调用以下函数,传递被点击的图片框:

private void AnimateCard(PictureBox picture)

    //part working as I would expect:
    Size defaultSize = picture.Size;
    Size temp = defaultSize;

    for (int w = defaultSize.Width; w != 0; w -= 2)
    
        temp.Width = w;
        picture.Size = temp;
        Thread.Sleep(10);
    

    //here would be where I change the images inside the picturesboxes

    //the part not working as I would expect:
    for (int w = temp.Width; w != defaultSize.Width; w += 2)
    
        temp.Width = w;
        picture.Size = temp;
        Thread.Sleep(10);
    


我会很高兴有任何建议来修复我的错误或以其他方式(在 Windows 窗体应用程序中)为我的“卡片翻转”设置动画!

【问题讨论】:

我知道你说过你在 WinForms 中需要它,但说真的,这不是 WinForms 的设计目的。您应该认真考虑 WPF。不过,我会看看是否能找到您的错误。 我和一个同学一起做这个项目,我们目前无法重新开始。游戏不需要动画,这就是我们首先使用winform的原因。我希望你能找到我找不到的东西:D 我怀疑 ui 在线程休眠时刷新。在之前插入刷新 【参考方案1】:

你的代码存在三个问题:

永远不要轻易比较平等;使用防御式编程并编写<<=。在这种情况下,对不等式的测试实际上相当于对相等性的测试!如果PictureboxWidth 是奇数,您的代码将失败! 除非你有计数器或枚举器,否则不要使用for;如果您想使用条件,请使用while。这是关于可读性的。 (其他)真正的难题是PictureBox 需要Refresh 用于增长部分。最好也将其包含在收缩部分中。..
Size defaultSize = pictureBox1.Size;
Size temp = defaultSize;

for (int w = defaultSize.Width; w > 0; w -= 2)

    temp.Width = w;
    pictureBox1.Size = temp;
    pictureBox1.Refresh();   // may be optional
    Thread.Sleep(10);



for (int w = temp.Width; w < defaultSize.Width; w += 2)

    temp.Width = w;
    pictureBox1.Size = temp;
    pictureBox1.Refresh();  // is necessary
    Thread.Sleep(10);

我将把转换留给你做一个循环。

【讨论】:

我了解使用 的安全性,但是在这种情况下,我知道大小始终相同,我可能应该使用常量值而不是变量或 。感谢您的回答! 两个问题是知道今天,但知道明天? (另一个问题原因可能是如果你的老师进行代码审查。我会扣分..)祝你好运 在某些时候,我实际上有 ,但当我发现它不是错误时,我将其反转,DOH。我将如何使用 while 循环? while(w+=2 关闭。方法不止一种。你使用的简洁风格可以写成int w = defaultSize.Width; while ( (w -= 2) &gt; 0)... .. while ( (w += 2) &lt; defaultSize.Width) .. 你会怎么写?【参考方案2】:

你在不知不觉中进入了线程和锁定用户界面的领域。

如果你只是想让它工作,那么在你的 Thread.Sleep(10) 放置之后(非常可怕):

Application.DoEvents();

这样做将允许表单处理事件并更新和绘制用户界面。

您还可以使用带有倒计时形式范围变量的计时器,以使其看起来不那么矫揉造作(但仍然有点矫揉造作)。

    bool postHiding;       
    private int defaultsize = picture.size;
    private void AnimateCard(PictureBox picture)
    
        postHiding = false;
        Timer1.Interval(12);
        Timer1.Start();
    

    private void Timer1_Tick(object obj, Eventargs e)
    
        Size temp = defaultSize;
        if (!postHiding)
        
            picture.Size.Width -=2;
            //This indicates the shrinking process is over
            if (picture.Size <= 0)
            
                postHiding = true;
            
         else // We are now revealing the other side of the card
        
            picture.Size.Width += 2;

            if (picture.Size >= defaultsize)
            
                //Animation is Over
                Timer1.Stop();
            
        
    

【讨论】:

以上是关于为啥我的图片框动画没有按预期工作(C# Windows 窗体应用程序)?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的查询没有按预期工作?

为啥我的 javascript 代码没有按预期工作

为啥我的依赖属性绑定没有按预期工作?

为啥我的 Firebase 安全规则没有按预期工作?

为啥我的 Laravel 一对一关系没有按预期工作?

为啥我的搜索功能没有按预期工作,我该如何解决?