我有一个展示作为一个相当长的过程中运行进度消息的形式。 这是对Web服务的调用,所以我真的不能显示进度条上显示完成百分比数字有意义。 (我并不特别喜欢进度栏的选框属性)
我想显示的动画GIF给过程中的一些活动的感觉(例如,文件从一台计算机飞往另一个像Windows复制过程)。
你怎么做到这一点?
我有一个展示作为一个相当长的过程中运行进度消息的形式。 这是对Web服务的调用,所以我真的不能显示进度条上显示完成百分比数字有意义。 (我并不特别喜欢进度栏的选框属性)
我想显示的动画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在形式上代表该组图片框的Visible属性与GIF至真/假。
请注意,在Windows中,传统上不使用GIF动画,但很少AVI动画:有一个Windows本地控制只是为了显示他们。 甚至有工具,GIF动画转换为AVI(反之亦然)。
如果你把它放在一个PictureBox控件,它应该只是工作
这不,当你开始落后长时间操作,因为一切都停止,因为你在同一个线程是请。
我有同样的问题,并通过实施这在我以前面对几个不同的问题在不同的解决方案来。 最后,下面是我把一些作品从不同岗位一起期待它为我工作。
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;
}