自定义进度条控件(BackgroundWorker)

自定义了两种样式,如下图。

这里写图片描述

这里写图片描述

代码如下

ProgressForm:

namespace ProgressForm
{
    public partial class ProgressForm : Form
    {
        private UserCircularProgress circularProgress;
        private UserProgressBar progressBar;

        private bool isProgressBar;

        public bool IsProgressBar
        {
            set
            {
                if (value == true)
                {
                    if (progressBar == null)
                        progressBar = new UserProgressBar();
                    progressBar.Dock = DockStyle.Fill;
                    this.Controls.Add(progressBar);
                    isProgressBar = true;
                }
            }
        }
        public bool IsCircularProgress
        {
            set
            {
                if (value == true)
                {
                    if (circularProgress == null)
                        circularProgress = new UserCircularProgress();
                    circularProgress.Dock = DockStyle.Fill;
                    this.Controls.Add(circularProgress);
                    isProgressBar = false;
                }
            }
        }



        private BackgroundWorker backgroundWorker=new BackgroundWorker();

        public event DoWorkEventHandler DoWork
        {
            add { backgroundWorker.DoWork += value; }
            remove { backgroundWorker.DoWork -= value; }
        }
        public ProgressForm()
        {          
            InitializeComponent();
            isProgressBar = true;
            backgroundWorker.WorkerSupportsCancellation = true;//是否支持异步取消
            backgroundWorker.WorkerReportsProgress = true;//能否报告进度更新
            backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;//响应 worker.ReportProgress();
            backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;//响应worker.CancelAsync();
        }

        private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            this.Close();
        }
        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if(isProgressBar)
            {
                progressBar.ChangeValue(e.ProgressPercentage);// e.ProgressPercentage接收ReportProgress的第一个参数
            }
            else
            {
                if (e.UserState != null)
                {
                    string message = e.UserState.ToString() ;// e.UserState.ToString()接收ReportProgress的第二个参数
                    circularProgress.ChangeValue(message);
                }
            }          
        }
        public void Start(object argument = null, IWin32Window owner = null)
        {
            if (owner == null)
                owner = this.TopLevelControl;
            this.StartPosition = FormStartPosition.CenterParent;
            backgroundWorker.RunWorkerAsync(argument); //这个argument可以在DoWork的方法中接收,根据e.Argument.ToString()来判断是否执行
            ShowDialog(owner);

        }

        public void ReportProgress(int value)
        {
            backgroundWorker.ReportProgress(value);
        }
        public void ReportProgress(int value, object userState)
        {
            backgroundWorker.ReportProgress(value, userState);
        }

        public void CancelAsync()
        {
            backgroundWorker.CancelAsync();
        }
        private void ProgressForm_FormClosed(object sender, FormClosedEventArgs e)
        {
            backgroundWorker.CancelAsync();
        }
    }    
}

UserCircularProgress:

namespace ProgressForm
{
    public partial class UserCircularProgress : UserControl
    {
        public UserCircularProgress()
        {
            InitializeComponent();
            circularProgress1.IsRunning = true;
        }

        public void ChangeValue(string message)
        {
            labelX1.Text = message;
        }
    }
}

UserProgressBar:

namespace ProgressForm
{
    public partial class UserProgressBar : UserControl
    {      

        public UserProgressBar()
        {
            InitializeComponent();

        }
        public void ChangeValue(int value)
        {
            progressBarX1.Value = value;
            progressBarX1.Text = value + "%";
        }
    }
}

Form1:

namespace ProgressForm
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            using (ProgressForm form = new ProgressForm())
            {
                form.IsProgressBar = true;
                form.DoWork += delegate (object s, DoWorkEventArgs e1)
                  {
                      for (int i = 1; i <= 100; i++)
                      {
                          Thread.Sleep(300);
                          form.ReportProgress(i);//报告进度
                      }
                  };
                form.Start(owner: this);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            using (ProgressForm form = new ProgressForm())
            {
                form.IsCircularProgress = true;
                form.DoWork += delegate (object s, DoWorkEventArgs e1)
                {
                    for (int i = 1; i <= 100; i++)
                    {
                        Thread.Sleep(300);
                        form.ReportProgress(i, "循环到数字 " + i.ToString());//报告进度,和信息
                    }
                };
                form.Start(owner: this);
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值