C# ToolStripProgressBar 用法简析

C# ToolStripProgressBar 用法简析

因为最近写了一个处理图像的小程序,在处理的过程中耗时较长,因此想在窗体底部加一个进度条来指示处理的过程进度,发现有ToolStripProgressBar这么一个神奇的控件,可以方便的用来反映进度情况。但是对于如何使用,初次接触也是比较懵,因此习惯性的去MSDN查找了官方文档。果然官方文档给出了一个详细的例程,此处贴出链接:MSDN:ToolStripProgressBar

使用方法

ProgressBar控件需要配合一个名为BackgroundWorker的Class配合使用。该类是一个可以独立于主线程工作的子线程,只要将需要用进度条指示的动作绑定到这个类中,并根据完成程度实时的对进度条进度值进行改写,即可实现进度条的同步显示。此处要注意的是,为了实时反映工作的进度,需要将BackgroundWorker的WorkerReportsProgress属性改为True。
主要需要对BackgroundWorker绑定以下三个事件:

  • 开始工作的动作:DoWork
  • 完成工作的动作:RunWorkerCompleted
  • 工作中刷新的动作:ProgressChanged

首先来看一下如何绑定事件,这部分可以在视图设计器中进行绑定,也可以在实现的代码中手动绑定,此处示例在代码中手动绑定:

private void InitializeBackgroundWorker()
{
    backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
    backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(
            backgroundWorker1_RunWorkerCompleted);
    backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(
            backgroundWorker1_ProgressChanged);
}

开始工作DoWork

这里需要将用进度条指示的函数进行绑定,要注意,该函数需要有两个用于BackgroundWorker控制的参数传入,其中worker参数用于还原BackgroundWorker对象,而e参数可以指示动作完成的事件是如何被触发的(用户取消or动作完成)。因此函数定义格式应当如下:

private void DoSomething(BackgroundWorker worker, DoWorkEventArgs e)

在这个动作事件中需要进行两件事:第一,还原出worker;第二,调用DoSomething函数开始工作。代码参考如下:

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
     //还原worker对象
     BackgroundWorker worker = sender as BackgroundWorker;
     //开始工作
     DoSomething(worker, e);
}

结束工作RunWorkerCompleted

这里用于指示工作结束时该如何进行下一步动作。并且可以根据传入的参数e来区分工作是中止或完成,以此来进行不同的“收尾”工作。代码参考如下:

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    //还原Worker对象
    BackgroundWorker worker = sender as BackgroundWorker;
    //判断是否由错误造成意外中止
    if (e.Error != null)
    {
        //若发生错误,弹窗显示错误信息
        MessageBox.Show(e.Error.Message);
    }
    //判断是否用户手动取消,若程序要支持此处功能,需要程序中有cancel的动作,并在该动作中将e.cancel置为true
    else if (e.Cancelled)
    {
        //添加用户手动取消的动作
        MessageBox.Show("Canceled");
    }
    //判断是否正常结束
    else
    {
        //添加正常结束之后的收尾动作
        MessageBox.Show("Complete"); 
    }
}

工作中刷新ProgressChanged

针对加进度条这个目标来说,这里只要更新进度条的进度值即可。此处也可以加入用户在过程中需要实时刷新的内容。代码示例如下:

private void backgroundWorker1_ProgressChanged(object sender,ProgressChangedEventArgs e)
{
    //更新进度条进度值
    this.toolStripProgressBar1.Value = e.ProgressPercentage;
}

总结

本篇博文用来介绍如何使用BackgroundWorkerToolStripProgressBar来反映后台工作的进度,并未给出具体的工程项目,此处给出一些参考 :MSDN-斐波那契数列生成1、我自己做的图像处理小软件2

展开阅读全文

没有更多推荐了,返回首页