WPF MVVM制作發(fā)送短信小按鈕
最近做一個項目,因為涉及到注冊,因此需要發(fā)送短信,一般發(fā)送短信都有一個倒計時的小按鈕,因此,就做了一個,在此做個記錄。
一、發(fā)送消息
沒有調用公司的短信平臺,只是模擬前臺生成一串數(shù)字,將此串數(shù)字輸出一下。
在這個部分寫了兩個類文件:一個是生成隨機數(shù),一個是模擬發(fā)送此數(shù)字的。
1、因為生成幾位隨機數(shù),是必須要到項目上線之前才能定的,因此,寫了一個帶參數(shù)的函數(shù),如下
/// <summary> /// 生成隨機驗證碼 /// </summary> public static class RandomCode { /// <summary> /// 返回一個N位驗證碼 /// </summary> /// <param name="N">位數(shù)</param> /// <returns></returns> public static string RandomCodeCommand(int N) { string code = ""; Random random = new Random(); for (int i = 0; i < N; i++) { code += random.Next(9); } return code; } }
2、模擬發(fā)送此串數(shù)字。
這個類里面用了兩個Timer函數(shù),一個是用作Button的倒數(shù)顯示的,另一個是用作保存這個驗證碼時長的。
在記錄驗證碼的同時,還需要記錄發(fā)送驗證碼的手機號,以防止,用戶用第一個手機號點擊了發(fā)送驗證碼后,把手機號部分修改為其他的手機號。
public class SendRandomCode : ViewModelBase { private int _interval;//記錄倒計時長 private string idCode;//在規(guī)定時間內保存驗證碼 private int idCodeTime;//設置驗證碼的有效時間(秒) private int idCodeNum = 6;//設置驗證碼的位數(shù) public void GetCode(string phoneNum) { //獲取驗證碼 timerSend = new Timer(1000); timerSend.AutoReset = true; timerSend.Elapsed += Timer_Elapsed; _interval = SecondNum; timerSend.Start(); //在驗證碼有效期內,再次請求驗證碼,需要先關閉上一次的 if (timerTime != null) { timerTime.Close(); timerTime.Dispose(); } //驗證碼的有效期 timerTime = new Timer(1000); timerTime.AutoReset = true; timerTime.Elapsed += TimerTime_Elapsed; timerTime.Start(); idCodeTime = SaveTime; IdCode = RandomCode.RandomCodeCommand(idCodeNum); PhoneNum = phoneNum; } #region 獲取驗證碼倒計時 Timer timerSend; Timer timerTime; private void Timer_Elapsed(object sender, ElapsedEventArgs e) { BtnIsEnable = false; BtnContent = "(" + (_interval--) + ")秒后再次獲取驗證碼"; if (_interval <= -1) { BtnIsEnable = true; BtnContent = "獲取驗證碼"; timerSend.Stop(); timerSend.Dispose(); } //throw new NotImplementedException(); } private void TimerTime_Elapsed(object sender, ElapsedEventArgs e) { idCodeTime--; if (idCodeTime <= 0) { IdCode = ""; timerTime.Stop(); timerTime.Dispose(); } Console.WriteLine(IdCode); //throw new NotImplementedException(); } #endregion #region 字段 //*************************************************************************************************//上線時需要修改 private int secondNum = 30;//設置倒計時長 private int saveTime = 60;//設置保存驗證碼時長 //*************************************************************************************************// private string btnContent = "獲取驗證碼";//設置獲取驗證碼按鈕顯示的名稱 private bool btnIsEnable = true;//設置獲取驗證碼按鈕是否可用 private string phoneNum;//記錄是否是發(fā)送驗證碼的手機號 public int SecondNum { get { return secondNum; } set { secondNum = value; } } public int SaveTime { get { return saveTime; } set { saveTime = value; } } public string BtnContent { get { return btnContent; } set { btnContent = value; RaisePropertyChanged("BtnContent"); } } public bool BtnIsEnable { get { return btnIsEnable; } set { btnIsEnable = value; RaisePropertyChanged("BtnIsEnable"); } } public string IdCode { get { return idCode; } set { idCode = value; RaisePropertyChanged("IdCode"); } } public string PhoneNum { get { return phoneNum; } set { phoneNum = value; RaisePropertyChanged("PhoneNum"); } } #endregion }
二、XAML頁面代碼
<Grid> <Grid.RowDefinitions> <RowDefinition/> <RowDefinition/> </Grid.RowDefinitions> <StackPanel Grid.Row="0" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal"> <Label Content="手機號"/> <TextBox Text="{Binding PhoneNum}" Height="20" Width="100"/> <Button Content="{Binding Src.BtnContent}" IsEnabled="{Binding Src.BtnIsEnable}" Command="{Binding SendCode}" Height="20" Width="120"/> </StackPanel> <StackPanel Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center" Orientation="Horizontal"> <Label Content="驗證碼"/> <TextBox Text="{Binding IdentifyCode}" Height="20" Width="100"/> <Button Content="提交" Command="{Binding Submit}" Height="20" Width="120"/> </StackPanel> </Grid>
三、VM頁面代碼
VM頁面沒有什么特別的,就是聲明了一些字段,
特別注意的是,由于前臺的XAML頁面上的發(fā)送短信按鈕是需要倒計時的,因此Button的Content和IsEnable需要綁定到SendRandomCode這個類上,所以需要在VM下聲明一下這個類
public class BingVM: ViewModelBase { #region 界面字段 private string phoneNum;//手機號 private string identifyCode;//驗證碼 public string PhoneNum { get { return phoneNum; } set { phoneNum = value; RaisePropertyChanged("PhoneNum"); } } public string IdentifyCode { get { return identifyCode; } set { identifyCode = value; RaisePropertyChanged("IdentifyCode"); } } #endregion #region 為獲取驗證碼按鈕設置content和isEnable用的 SendRandomCode src = new SendRandomCode(); public SendRandomCode Src { get { return src; } set { src = value; } } #endregion private RelayCommand sendCode;//獲取驗證碼 public RelayCommand SendCode { get { return sendCode ?? (sendCode = new RelayCommand( () => { if (!string.IsNullOrEmpty(PhoneNum)) { src.GetCode(PhoneNum); } else { MessageBox.Show("手機號不能為空!"); } })); } } private RelayCommand submit; public RelayCommand Submit { get { return submit ?? (submit = new RelayCommand( () => { if (IdentifyCode == src.IdCode && PhoneNum == src.PhoneNum) { MessageBox.Show("驗證成功"); } else { MessageBox.Show("驗證失敗"); } })); } } }
四、效果展示
上面是成功的效果圖。
驗證失敗的情況如下:
1、如果在發(fā)送驗證碼的過程中,把手機號修改了,填入原有的驗證碼
2、如果輸入的驗證碼不是程序輸出的驗證碼
3、時間超過了驗證碼的保存時間
BUG修復:
剛才在測試的過程中發(fā)現(xiàn)了一個問題,由于我們做的主程序是調用模塊的DLL文件生成磁貼的,而主程序的返回按鈕,不會關閉掉當前磁貼的所有線程,導致當返回再進入此磁貼時,再次點擊發(fā)送按鈕,則會再次出現(xiàn)一個驗證碼,解決方式很簡單:修改SendRandomCode代碼,在Timer timerTime;前加static,是其成為靜態(tài)的。這樣再次點擊時,就是知道線程已存在,先關閉再發(fā)送。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C# Onnx CenterNet實現(xiàn)目標檢測的示例詳解
這篇文章主要為大家詳細介紹了C# Onnx CenterNet實現(xiàn)目標檢測的相關知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2023-12-12C#?webApi創(chuàng)建與發(fā)布、部署、api調用詳細教程
這篇文章主要給大家介紹了關于C#?webApi創(chuàng)建與發(fā)布、部署、api調用的相關資料,WebApi是微軟在VS2012?MVC4版本中綁定發(fā)行的,WebApi是完全基于Restful標準的框架,文中通過圖文介紹的非常詳細,需要的朋友可以參考下2023-12-12C#實現(xiàn)Winform小數(shù)字鍵盤模擬器
本文主要介紹了C#實現(xiàn)Winform小數(shù)字鍵盤模擬器,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11在C#中創(chuàng)建和讀取XML文件的實現(xiàn)方法
項目中需要將前臺頁面中的信息保存下來并存儲為xml文件格式到數(shù)據(jù)庫中去。因此我先在這里通過一個小實例來學習xml的創(chuàng)建與讀取2013-09-09