自定义进度条控件(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);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/m0_38110784/article/details/79086959
今日推荐