执行长过程时 Windows 形式的动画 GIF
Animated GIF in Windows Form while executing long process
我用 C# 开发了一个简单的 windows 应用程序 (MDI),它将数据从 SQL 导出到 Excel。
我正在使用 ClosedXML 成功实现这一目标。
执行该过程时,我想显示一个包含动画 GIF 图像的图片框。
我是初学者,不知道怎么实现,处理完成后出现图片框
我看到很多帖子说要使用我从未使用过的 backgroundworker 或线程,并且发现很难实现。
我能有一个带解释的分步示例吗?
我创建的两个函数,在执行代码之前和之后调用。
private void Loading_On()
{
Cursor.Current = Cursors.WaitCursor;
pictureBox2.Visible = true;
groupBox1.Enabled = false;
groupBox5.Enabled = false;
groupBox6.Enabled = false;
Cursor.Current = Cursors.Arrow;
}
private void Loading_Off()
{
Cursor.Current = Cursors.Arrow;
pictureBox2.Visible = false;
groupBox1.Enabled = true;
groupBox5.Enabled = true;
groupBox6.Enabled = true;
Cursor.Current = Cursors.WaitCursor;
}
添加一个BackgroundWorker
并不难
- 在设计器中打开表单
- 打开工具箱(ctrl+alt+X)
- 打开类别组件
- 将 Backgroundworker 拖到您的 From
你最终会得到这样的结果:
您现在可以切换到“属性”选项卡上的事件视图,并为 DoWork and RunWorkerCompleted
添加事件
以下代码用于这些事件,请注意 DoWork
如何使用 DowWorkEventArgs
参数 属性 检索 RunWorkerAsync
.[=21 中提供的值=]
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// start doing what ever needs to be done
// get the argument from the EventArgs
string comboboxValue = (string) e.Argument; // if Argument isn't string, this breaks
// remember that this is NOT on the UI thread
// do a lot of work here that takes forever
System.Threading.Thread.Sleep(10000);
// afer this the completed event is fired
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// this runs on the UI thread
Loading_Off();
}
现在只需要启动后台作业,例如从按钮点击事件调用RunWorkerAsync
private void button1_Click(object sender, EventArgs e)
{
Loading_On();
backgroundWorker1.RunWorkerAsync(comboBox1.SelectedItem); // pass a string here
}
完成!您已成功将后台工作者添加到表单中。
实现此目的的最佳方法是 运行 异步任务中的动画,但相应地,一些限制是可以使用线程睡眠在 windows 表单上执行此操作。
例如:在你的构造函数中,
public partial class MainMenu : Form
{
private SplashScreen splash = new SplashScreen();
public MainMenu ()
{
InitializeComponent();
Task.Factory.StartNew(() => {
splash.ShowDialog();
});
Thread.Sleep(2000);
}
在启动新线程后让线程休眠非常重要,不要忘记您在此线程上执行的每个操作都需要调用,例如
void CloseSplash(EventArgs e)
{
Invoke(new MethodInvoker(() =>
{
splash.Close();
}));
}
现在你的 gif 应该可以工作了!
我用 C# 开发了一个简单的 windows 应用程序 (MDI),它将数据从 SQL 导出到 Excel。
我正在使用 ClosedXML 成功实现这一目标。
执行该过程时,我想显示一个包含动画 GIF 图像的图片框。
我是初学者,不知道怎么实现,处理完成后出现图片框
我看到很多帖子说要使用我从未使用过的 backgroundworker 或线程,并且发现很难实现。
我能有一个带解释的分步示例吗?
我创建的两个函数,在执行代码之前和之后调用。
private void Loading_On()
{
Cursor.Current = Cursors.WaitCursor;
pictureBox2.Visible = true;
groupBox1.Enabled = false;
groupBox5.Enabled = false;
groupBox6.Enabled = false;
Cursor.Current = Cursors.Arrow;
}
private void Loading_Off()
{
Cursor.Current = Cursors.Arrow;
pictureBox2.Visible = false;
groupBox1.Enabled = true;
groupBox5.Enabled = true;
groupBox6.Enabled = true;
Cursor.Current = Cursors.WaitCursor;
}
添加一个BackgroundWorker
并不难- 在设计器中打开表单
- 打开工具箱(ctrl+alt+X)
- 打开类别组件
- 将 Backgroundworker 拖到您的 From
你最终会得到这样的结果:
您现在可以切换到“属性”选项卡上的事件视图,并为 DoWork and RunWorkerCompleted
添加事件以下代码用于这些事件,请注意 DoWork
如何使用 DowWorkEventArgs
参数 属性 检索 RunWorkerAsync
.[=21 中提供的值=]
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
// start doing what ever needs to be done
// get the argument from the EventArgs
string comboboxValue = (string) e.Argument; // if Argument isn't string, this breaks
// remember that this is NOT on the UI thread
// do a lot of work here that takes forever
System.Threading.Thread.Sleep(10000);
// afer this the completed event is fired
}
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// this runs on the UI thread
Loading_Off();
}
现在只需要启动后台作业,例如从按钮点击事件调用RunWorkerAsync
private void button1_Click(object sender, EventArgs e)
{
Loading_On();
backgroundWorker1.RunWorkerAsync(comboBox1.SelectedItem); // pass a string here
}
完成!您已成功将后台工作者添加到表单中。
实现此目的的最佳方法是 运行 异步任务中的动画,但相应地,一些限制是可以使用线程睡眠在 windows 表单上执行此操作。
例如:在你的构造函数中,
public partial class MainMenu : Form
{
private SplashScreen splash = new SplashScreen();
public MainMenu ()
{
InitializeComponent();
Task.Factory.StartNew(() => {
splash.ShowDialog();
});
Thread.Sleep(2000);
}
在启动新线程后让线程休眠非常重要,不要忘记您在此线程上执行的每个操作都需要调用,例如
void CloseSplash(EventArgs e)
{
Invoke(new MethodInvoker(() =>
{
splash.Close();
}));
}
现在你的 gif 应该可以工作了!