无法弄清楚与label1
相关联的imageList1
中的图片在按下鼠标按钮后不希望多次更改的原因。图像列表由7个图像组成,我想逐渐出现在标签元素中......这就是整个想法。
private void button1_Click(object sender, EventArgs e)
{
int number = 0;
for (int i = 0; i < imageList1.Images.Count; i++)
{
label1.Image = imageList1.Images[number++];
}
}
label1
属性中的默认ImageIndex设置为0(第一个图像),在for循环之后,它将转到index1。
答案 0 :(得分:1)
只有在整个按钮事件运行后,您的表单才会重新显示。这意味着你只会看到最后一张图片。调查后台工作人员或计时器以获得动画。如果动画是你的程序的主要目的,那么WPF就是你的选择。
答案 1 :(得分:1)
我猜最后一张图片还在吗?如果您希望图像一个接一个地显示超时,您应该执行类似
的操作private async void button1_Click(object sender, EventArgs e)
{
foreach (Image image in imageList1)
{
await Task.Delay(1000); //wait for one second before changing
label1.Image = image;
}
}
当然,根据您的要求,您可能需要禁用该按钮,正如@nvoigt所指出的,您可能希望使用UI框架的一些动画功能。
答案 2 :(得分:1)
你的循环确实分配了图像,但是没有时间显示它们,因为在循环结束之前没有更新UI。
您可以通过插入Application.DoEvents()
label1.Image = imageList1.Images[number++];
Application.DoEvents();
你可以试试,但你不应该实际使用这个作为你的解决方案!它有两个严重的问题,没有你想要的:
在Winforms中执行任何动画的最佳方法是使用Timer
。在按钮单击中,您将其设置并启动它。在它的Tick中你做动画..
在this post处找到了一个按钮动画示例!而不是Mouse_Enter
使用您的按钮单击。当图像全部显示时停止Timer
!
如果你想做的只是玩一点,习惯Timers
,我们强烈建议你不要使用WPF。如果你需要很多高级动画WPF确实是要走的路。
以下是最小解决方案的代码:
Timer timer1 = new Timer();
int imageIndex = 0;
private void timer1_Tick(object sender, EventArgs e)
{
if (imageIndex >= imageList1.Images.Count ) timer1.Stop();
label1.Image = imageList1.Images[imageIndex++];
}
private void button1_Click(object sender, EventArgs e)
{
imageIndex = 0;
timer1.Interval = 100; // change ms to suit your needs!
timer1.Start();
}
答案 3 :(得分:0)
您的代码存在各种问题。
number
,可以强制它与i
具有相同的值。如果这是您想要做的,为什么不简单地使用i
?结果是只显示最后一张图像。
要允许UI线程更新显示,您需要使用Application.DoEvents,例如:
foreach(Image image in imageList1.Images)
{
label1.Image = image;
Application.DoEvents();
}
当然,这只会同时浏览所有图像,因此您只会看到模糊。
如果您想要一个简单,流畅的动画,请使用[动画GIF 2或使用WPF。尝试在Windows窗体中使用单个图像执行此操作并不简单。
如果你想要显示一个动画,你可以像@Stilgar建议的那样延迟,虽然这不能保证动画的流畅。线程切换或高CPU负载意味着图像之间的延迟总是大于延迟量。结果将是一个不稳定的动画。
您可以使用计时器事件来更新图像。这样更好,但高CPU负载仍然可以延迟事件的处理。只有WPF可以保证动画流畅,无需复杂的编码。