1. 程式人生 > >C# Winform 利用委託非同步實現Button長按,TextBox內值累加累減,彈起停止

C# Winform 利用委託非同步實現Button長按,TextBox內值累加累減,彈起停止

功能需求:

        按下“+”按鈕實現設定值加0.1,長摁“+”按鈕實現設定值一直以0.1的基數累加,按鈕彈起,停止累加。同樣,摁下“-”按鈕實現設定值減0.1,長摁“-”按鈕實現設定值一直以0.1的基數累減,按鈕彈起,停止累減。

需求分析:

        功能拆分。

                功能一:按下按鈕實現設定值加0.1或者減0.1;

                功能二:長摁按鈕實現設定值一直以0.1的基數累加或者累減,按鈕彈起,停止累加或者累減。

         可行性分析。

                針對功能一:普通的按鈕Click事件即可以完成。

                針對功能二:首先需要知道按鈕是否被按下是否被彈起,所以直接使用MouseDown和MouseUp事件來確定和標識滑鼠按鈕的按下彈起動作。但是由於按鈕事件的處理過程是交由主執行緒(UI執行緒)處理,如果直接使用迴圈(計算)會導致程式假死。因此使用委託非同步呼叫迴圈(計算),利用按鈕按下和彈起動作啟動和停止迴圈(計算)。

話不多說了,來看看實現吧!

介面設計:

                兩個按鈕:btnAdd、btnSub,設定值顯示框:txtSetValue,其介面效果如下:


後臺設計:

                1.針對“+”按鈕實現累加

(1)定義1個標識位,用此標識“+”按鈕是否被按下,定義1個double型別的變數,存放加減後的TextBox的值。其定義如下

     bool isAddMouseDown = false;  //加按鈕是否按下
     double thisSetValue = 0D;     //textBox顯示的

(2)在滑鼠按下的時候啟用isAddMouseDown標識,計算,textBox顯示累加效果。在正式計算之前首先獲取獲取txtSetValue的初始值,然後定義委託,最後呼叫顯示。其具體過程如下

        //+按鈕滑鼠按下事件
        private void btnAdd_MouseDown(object sender, MouseEventArgs e)
        {
            isAddMouseDown = true;    //啟用按下標識
            try
            {
                thisSetValue = Convert.ToDouble(txtSetValue.Text);   //獲取txtSetValue的初始值
            }
            catch (Exception)
            {
                thisSetValue = 0D;
            }

            Action handler = new Action(this.Add);     //定義委託
            handler.BeginInvoke(null, null);           //非同步呼叫
        }

        /// <summary>
        /// 累加計算
        /// </summary>
        private void Add()
        {
            while (isAddMouseDown)
            {
                if (thisSetValue <= -1 || thisSetValue >= 50)
                {
                    this.Invoke(new Action(() => MessageBox.Show("超出設定值!","警告")));
                    break;
                }
                else
                {
                    thisSetValue += 0.1;   //計算:每次累加的單位,如果要累加的精度大點,該值設定大一些
                    this.Invoke(new Action(() => this.txtSetValue.Text = Math.Round(thisSetValue, 2).ToString()));  //介面顯示
                    System.Threading.Thread.Sleep(100);    //如果要速度塊,將這個值修改小點 
                }
            }
        }

(3)在“+”按鈕彈起的時候終止累加,即恢復標誌。其過程如下

        private void btnAdd_MouseUp(object sender, MouseEventArgs e)
        {
            isAddMouseDown = false;
            txtHz.Text = thisValueReal.ToString();
        }

               2.針對“-”按鈕實現累減

其過程實現原理和“+”類似,筆者就不再累述,希望讀者自行完成。


筆者總結:

(1).利用標誌位來啟動和終止迴圈。

(2).使用系統已定義好的Action完成委託的定義,然後利用BeginInvoke()的方法進行非同步呼叫。

(3).使用lambad表示式可以讓委託呼叫變得更簡單明瞭。