C# 根據BackgroundWoker非同步模型和ProgressBar控制元件,自定義進度條控制元件
阿新 • • 發佈:2020-05-30
### 前言
> 程式開發過程中,難免會有的業務邏輯,或者演算法之類產生讓人能夠感知的耗時操作,例如迴圈中對複雜邏輯處理;獲取資料庫百萬乃至千萬級資料;http請求的時候等......
> 使用者在使用UI操作並不知道程式的內部處理,從而誤操作導致程式無響應,關閉程式等待影響體驗的情況,因此,在等待過程中提供友好的等待提示是有必要的,接下來
> 我們一起封裝一個自定義進度條控制元件!
### 主要使用技術(C#相關)
* `BackgroundWoker`非同步模型
* `ProgressBar`控制元件
* 泛型
* 定時器 `System.Timers.Timer`
# 自定義控制元件開發
## 專案解決方案
![](https://img2020.cnblogs.com/blog/2038148/202005/2038148-20200530160015430-1748107377.png)
* BackgroundworkerEx : 自定義進度條控制元件工程
* Test : 呼叫BackgroundworkerEx的工程(只是展示如何呼叫)
## 處理控制元件樣式
![](https://img2020.cnblogs.com/blog/2038148/202005/2038148-20200530160040557-817681224.png)
* 新建一個ProgressbarEx名稱的 **使用者控制元件**
* 新增Labal控制元件(lblTips),用於展示進度條顯示的資訊狀態
* 新增一個PictureBox控制元件(PicStop),充當關閉按鈕,用於獲取使用者點選事件,觸發關閉/終止進度條
* 新增進度條ProgressBar控制元件(MainProgressBar)
* 處理程式碼如下:
1. 進度條樣式為"不斷迴圈",並且速度為50
2. 該自定義使用者控制元件不展示在工作列中
3. 圖片控制元件被點選事件------>設定當前屬性`IsStop=true`,指示過程終止;
4. `TipMessage`屬性,用於設定進度條的資訊
5. `SetProgressValue(int value)` 設定進度條的`Value`屬性,使得在`ProgressBarStyle.Marquee`樣式中動畫平滑
6. `MouseDown`/`MouseUp`/`MouseMove`這三個事件是用於拖動無邊框的使用者控制元件(程式碼就不貼了 )
```c#
public ProgressbarEx()
{
InitializeComponent();
MainProgressBar.Style = ProgressBarStyle.Marquee;
MainProgressBar.MarqueeAnimationSpeed = 50;
this.ShowInTaskbar = false;
PicStop.Click += (s, eve) =>
{
IsStop = true;
};
this.MouseDown += CusProgressForm_MouseDown;
this.MouseUp += CusProgressForm_MouseUp;
this.MouseMove += CusProgressForm_MouseMove;
}
///
/// Need Stop ?
///
public bool IsStop { get; private set; } = false;
///
/// TipMessage
///
public string TipMessage { get; set; }
///
/// TipMessage
///
public string TipMessage
{
get
{
return lblTips.Text;
}
set
{
lblTips.Text = value;
}
}
///
/// Set ProgressBar value ,which makes ProgressBar smooth
///
///
public void SetProgressValue(int value)
{
if (MainProgressBar.Value == 100) MainProgressBar.Value = 0;
MainProgressBar.Value += value;
}
```
到現在,這個自定義進度條控制元件的樣式基本完成了.
## 功能邏輯處理
#### 執行前所需
* 定義`Background