Label.Image逐渐增加for循环

时间:2014-06-19 11:52:53

标签: c# for-loop

无法弄清楚与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。

4 个答案:

答案 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()

来强制更新UI
label1.Image = imageList1.Images[number++];   
Application.DoEvents();

你可以试试,但你不应该实际使用这个作为你的解决方案!它有两个严重的问题,没有你想要的:

  • 它无法控制动画速度。
  • 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线程更新显示。 UI线程仅在事件处理程序完成后才更新显示。

结果是只显示最后一张图像。

要允许UI线程更新显示,您需要使用Application.DoEvents,例如:

foreach(Image image in imageList1.Images)
{
    label1.Image = image;
    Application.DoEvents();
}

当然,这只会同时浏览所有图像,因此您只会看到模糊。

如果您想要一个简单,流畅的动画,请使用[动画GIF 2或使用WPF。尝试在Windows窗体中使用单个图像执行此操作并不简单。

如果你想要显示一个动画,你可以像@Stilgar建议的那样延迟,虽然这不能保证动画的流畅。线程切换或高CPU负载意味着图像之间的延迟总是大于延迟量。结果将是一个不稳定的动画。

您可以使用计时器事件来更新图像。这样更好,但高CPU负载仍然可以延迟事件的处理。只有WPF可以保证动画流畅,无需复杂的编码。