[英]How to show an animated loading form while executing code in Windows Forms C#
[英]How do you show animated GIFs on a Windows Form (c#)
我有一个表格显示进度消息作为一个相当长的过程运行。 这是对 web 服务的调用,所以我无法真正有意义地在进度条上显示完成百分比数字。 (我不是特别喜欢进度条的Marquee属性)
我想展示一个 GIF 动画,让过程感觉像是在进行某种活动(例如,文件从一台计算机飞到另一台计算机,如 Windows 复制过程)。
你怎么做到这一点?
这不是太难。
需要考虑的事项:
动画 gif:
如果您正在寻找动画 gif,您可以生成它们:
另一种方法:
我发现的另一种非常有效的方法是我在代码项目中找到的异步对话框控件
我有同样的问题。 由于在后台长时间操作,整个表单(包括 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 的图片框的可见属性设置为 true/false。
请注意,在 Windows 中,您通常不使用动画 Gif,而是使用很少的 AVI 动画:有一个 Windows 本机控件只是为了显示它们。 甚至还有工具可以将动画 Gif 转换为 AVI(反之亦然)。
如果你把它放在一个 PictureBox 控件中,它应该可以正常工作
当你在后面开始一个长时间的操作时它不会,因为一切都停止了,因为你在同一个线程中。
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
太晚了,但是。 将图像设置为 PictureBox.Image 并设置 PictureBox.SizeMode = PictureBoxSizeMode.Zoom 就可以了。Net Framework 4.8
PictureBox.Image = Image.FromFile("location"); // OR From base64 PictureBox.SizeMode = PictureBoxSizeMode.Zoom;
我遇到了同样的问题,并且通过实施我曾经遇到过几个不同的问题,遇到了不同的解决方案。 最后,下面是我将来自不同帖子的一些片段放在一起,它们按预期对我有用。
private void btnCompare_Click(object sender, EventArgs e)
{
ThreadStart threadStart = new ThreadStart(Execution);
Thread thread = new Thread(threadStart);
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
}
下面是 Execution 方法,它也带有调用 PictureBox 控件:
private void Execution()
{
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = true; });
Application.DoEvents();
// Your main code comes here . . .
btnCompare.Invoke((MethodInvoker)delegate { pictureBox1.Visible = false; });
}
请记住,PictureBox 在属性窗口中是不可见的,或者执行以下操作:
private void ComparerForm_Load(object sender, EventArgs e)
{
pictureBox1.Visible = false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.