我在C#中有一个Winforms应用程序,它调用异步调用方法并使用回调。 我想显示一个动画gif,让最终用户知道正在完成的工作。 我希望将动画gif悬停在表单的中心上。
我该怎么做?
更新: 谢谢。我想我缺少的一步是使用一个图片框来保持gif。 以下似乎是在做显示gif的技巧,就像下面说的jmatthews3865我可以将PictureBox的visible属性设置为false来隐藏它。
private ShowAnimatedGif()
{
PictureBox pb = new PictureBox();
this.Controls.Add(pb);
pb.Left = (this.Width / 2) - (pb.Width / 2);
pb.Top = (this.Height / 2) - (pb.Height / 2);
pb.Image = Resources.AnimatedGifHere;
pb.Visible = true;
}
答案 0 :(得分:2)
需要一些代码才能给出确切的答案,但这非常简单,在进行异步调用之前插入gif,然后在回调中删除它。
答案 1 :(得分:2)
,只需将图像的可见属性设置为false即可。
从调用长时间运行的异步进程(button1_click等)的事件中,将images visibility属性设置为true。事件触发,图像出现,异步进程运行,你的ui线程应该仍然响应。
在回调事件中将images visible属性设置为false,表示该过程已完成。
答案 2 :(得分:1)
这就是答案。我正在使用LoadingCircle,这是一个动画gif组件。
public partial class Form1 : Form
{
public delegate void ProcessAnimation(bool show);
ProcessAnimation pa;
public Form1()
{
InitializeComponent();
pa = this.ShowAnimation;
}
private void button2_Click(object sender, EventArgs e)
{
Thread tr = new Thread(FlushToServer);
tr.Start();
}
private void ShowAnimation(bool show)
{
if (show)
{
loadingCircle1.Visible = true;
loadingCircle2.Active = true;
}
else
{
loadingCircle1.Visible = false;
loadingCircle1.Active = false;
}
}
private void FlushToServer()
{
this.Invoke(this.pa,true);
//your long running process
System.Threading.Thread.Sleep(5000);
this.Invoke(this.pa,false);
}
}
答案 3 :(得分:0)
我稍微修改了上面的代码并且它不会抛出错误“在创建窗口句柄之前,无法在控件上调用c#invoke或begininvoke。”
namespace AnimateUI
{
public partial class Form1 : Form
{
public delegate void ProcessAnimation(bool show);
ProcessAnimation pa;
public Form1()
{
InitializeComponent();
pa = this.ShowAnimation;
pictureBox1.Visible = false;
}
private void ShowAnimation(bool show)
{
if (show)
{
pictureBox1.Visible = true;
}
else
{
pictureBox1.Visible = false;
}
}
private void button1_Click(object sender, EventArgs e)
{
Thread tr = new Thread(StartTask);
tr.Start();
}
private void StartTask()
{
if (!this.IsHandleCreated)
this.CreateControl();
this.Invoke(this.pa, true);
System.Threading.Thread.Sleep(15000);
this.Invoke(this.pa, false);
}
}
}