为啥我的图片框动画没有按预期工作(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】:你的代码存在三个问题:
永远不要轻易比较平等;使用防御式编程并编写<
或<=
。在这种情况下,对不等式的测试实际上相当于对相等性的测试!如果Picturebox
的Width
是奇数,您的代码将失败!
除非你有计数器或枚举器,否则不要使用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) > 0)... .. while ( (w += 2) < 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 窗体应用程序)?的主要内容,如果未能解决你的问题,请参考以下文章