C# Winform 利用委託非同步實現Button長按,TextBox內值累加累減,彈起停止
阿新 • • 發佈:2018-11-28
功能需求::
按下“+”按鈕實現設定值加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表示式可以讓委託呼叫變得更簡單明瞭。