1. 程式人生 > >C# 根據BackgroundWoker非同步模型和ProgressBar控制元件,自定義進度條控制元件

C# 根據BackgroundWoker非同步模型和ProgressBar控制元件,自定義進度條控制元件

### 前言 > 程式開發過程中,難免會有的業務邏輯,或者演算法之類產生讓人能夠感知的耗時操作,例如迴圈中對複雜邏輯處理;獲取資料庫百萬乃至千萬級資料;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