如何在 Windows 窗体上显示动画 GIF (c#)
-
03-07-2019 - |
题
我有一个表格,显示相当长的流程运行时的进度消息。这是对网络服务的调用,因此我无法真正有意义地在进度条上显示完整的百分比数字。(我不是特别喜欢进度条的Marquee属性)
我想展示一个动画 GIF,让这个过程有某种活动的感觉(例如文件从一台计算机飞到另一台计算机(如 Windows 复制过程)。
你怎么做到这一点?
其他提示
我遇到了同样的问题。整个表单(包括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是表单的委托,它将pictureBox的可见属性设置为gif为true / false。
请注意,在Windows中,您通常不使用动画Gif,但使用AVI动画:只有一个Windows本机控件才能显示它们。甚至还有将GIF动画转换为AVI的工具(反之亦然)。
如果你将它放在PictureBox控件中,它应该可以正常工作
当你开始长时间的操作时,它不会,因为你在同一个线程中的所有东西都是STOPS。
我有同样的问题,并通过实施我遇到过几个不同的问题而遇到了不同的解决方案。最后,下面是我将不同帖子中的一些内容放在一起,这对我来说是预期的。
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控件:
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;
}
不隶属于 StackOverflow