自定义了两种样式,如下图。
代码如下
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);
}
}
}
}