151

我有一个表格显示进度消息,因为进程运行时间相当长。这是对 Web 服务的调用,所以我无法在进度条上有意义地显示完成百分比。(我不是特别喜欢进度条的 Marquee 属性)

我想展示一个动画 GIF 以使该过程具有某种活动的感觉(例如文件从一台计算机飞到另一台计算机,如 Windows 复制过程)。

你怎么做到这一点?

4

7 回答 7

263

这不是太难。

  1. 将图片框拖放到您的表单上。
  2. 将 .gif 文件添加为图片框中的图像
  3. 加载时显示图片框。

需要考虑的事项:

  • 禁用图片框将阻止 gif 动画。

动画 GIF:

如果您正在寻找动画 gif,您可以生成它们:

AjaxLoad - Ajax 加载 gif 生成器

另一种方法:

我发现效果很好的另一种方法是我在代码项目中找到的异步对话框控件

于 2008-10-03T04:59:05.147 回答
12

我有同样的问题。由于在后台工作的长时间操作,整个表单(包括 gif)停止重绘自身。这是我解决这个问题的方法。

  private void MyThreadRoutine()
  {
   this.Invoke(this.ShowProgressGifDelegate);
   //your long running process
   System.Threading.Thread.Sleep(5000);
   this.Invoke(this.HideProgressGifDelegate);
  }

  private void button1_Click(object sender, EventArgs e)
  {
   ThreadStart myThreadStart = new ThreadStart(MyThreadRoutine);
   Thread myThread = new Thread(myThreadStart);
   myThread.Start(); 
  }

我只是创建了另一个线程来负责这个操作。多亏了这个初始形式,继续重绘没有问题(包括我的 gif 工作)。ShowProgressGifDelegate 和 HideProgressGifDelegate 是表单中的代表,将带有 gif 的图片框的可见属性设置为真/假。

于 2010-12-19T14:48:40.930 回答
7

请注意,在 Windows 中,您通常不使用动画 Gif,而是使用少量 AVI 动画:有一个 Windows 本机控件来显示它们。甚至还有将动画 Gif 转换为 AVI 的工具(反之亦然)。

于 2008-10-03T05:16:41.890 回答
3

如果你把它放在 PictureBox 控件中,它应该可以工作

于 2008-10-03T04:58:17.520 回答
1

当您在后面开始长时间的操作时不会这样做,因为因为您在同一个线程中,所以一切都停止了。

于 2009-02-17T13:57:12.500 回答
1
Public Class Form1

    Private animatedimage As New Bitmap("C:\MyData\Search.gif")
    Private currentlyanimating As Boolean = False

    Private Sub OnFrameChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)

        Me.Invalidate()

    End Sub

    Private Sub AnimateImage()

        If currentlyanimating = True Then
            ImageAnimator.Animate(animatedimage, AddressOf Me.OnFrameChanged)
            currentlyanimating = False
        End If

    End Sub

    Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)

        AnimateImage()
        ImageAnimator.UpdateFrames(animatedimage)
        e.Graphics.DrawImage(animatedimage, New Point((Me.Width / 4) + 40, (Me.Height / 4) + 40))

    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        BtnStop.Enabled = False

    End Sub

    Private Sub BtnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStop.Click

        currentlyanimating = False
        ImageAnimator.StopAnimate(animatedimage, AddressOf Me.OnFrameChanged)
        BtnStart.Enabled = True
        BtnStop.Enabled = False

    End Sub

    Private Sub BtnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnStart.Click

        currentlyanimating = True
        AnimateImage()
        BtnStart.Enabled = False
        BtnStop.Enabled = True

    End Sub

End Class
于 2019-12-01T06:15:14.427 回答
0

我遇到了同样的问题,并且通过实施我曾经面临几个不同问题的解决方案遇到了不同的解决方案。最后,下面是我将来自不同帖子的一些片段放在一起的内容,它们对我来说是预期的。

private void btnCompare_Click(object sender, EventArgs e)
{
    ThreadStart threadStart = new ThreadStart(Execution);
    Thread thread = new Thread(threadStart);
    thread.SetApartmentState(ApartmentState.STA);
    thread.Start();
}

下面是同样携带调用 PictureBox 控件的 Execution 方法:

private void Execution()
{
    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
    Application.DoEvents();

    // Your main code comes here . . .

    btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}

请记住,图片框在属性窗口中是不可见的,或者执行以下操作:

private void ComparerForm_Load(object sender, EventArgs e)
{
    pictureBox1.Visible = false;
}
于 2017-02-08T01:06:59.140 回答