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表达式可以让委托调用变得更简单明了。



猜你喜欢

转载自blog.csdn.net/YouyoMei/article/details/79753619