程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> WPF MVVM制造發送短信小按鈕

WPF MVVM制造發送短信小按鈕

編輯:C#入門知識

WPF MVVM制造發送短信小按鈕。本站提示廣大學習愛好者:(WPF MVVM制造發送短信小按鈕)文章只能為提供參考,不一定能成為您想要的結果。以下是WPF MVVM制造發送短信小按鈕正文


最近做一個項目,由於觸及到注冊,因而需求發送短信,普通發送短信都有一個倒計時的小按鈕,因而,就做了一個,在此做個記載。

一、發送音訊

  沒有調用公司的短信平台,只是模仿前台生成一串數字,將此串數字輸入一下。

  在這個局部寫了兩個類文件:一個是生成隨機數,一個是模仿發送此數字的。

1、由於生成幾位隨機數,是必需要到項目上線之前才干定的,因而,寫了一個帶參數的函數,如下 

  /// <summary>
  /// 生成隨機驗證碼
  /// </summary>
  public static class RandomCode
  {
    /// <summary>
    /// 前往一個N位驗證碼
    /// </summary>
    /// <param name="N">位數</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、模仿發送此串數字。

  這個類外面用了兩個Timer函數,一個是用作Button的倒數顯示的,另一個是用作保管這個驗證碼時長的。

  在記載驗證碼的同時,還需求記載發送驗證碼的手機號,以避免,用戶用第一個手機號點擊了發送驗證碼後,把手機號局部修正為其他的手機號。 

public class SendRandomCode : ViewModelBase
  {
    private int _interval;//記載倒計時長
    private string idCode;//在規則時間內保管驗證碼
    private int idCodeTime;//設置驗證碼的無效時間(秒)
    private int idCodeNum = 6;//設置驗證碼的位數

    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;//記載能否是發送驗證碼的手機號
    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頁面上的發送短信按鈕是需求倒計時的,因而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、假如在發送驗證碼的進程中,把手機號修正了,填入原有的驗證碼

2、假如輸出的驗證碼不是順序輸入的驗證碼

3、時間超越了驗證碼的保管時間

 BUG修復:

方才在測試的進程中發現了一個問題,由於我們做的主順序是調用模塊的DLL文件生成磁貼的,而主順序的前往按鈕,不會封閉掉以後磁貼的一切線程,招致當前往再進入此磁貼時,再次點擊發送按鈕,則會再次呈現一個驗證碼,處理方式很復雜:修正SendRandomCode代碼,在Timer timerTime;前加static,是其成為靜態的。這樣再次點擊時,就是知道線程已存在,先封閉再發送。

以上就是本文的全部內容,希望對大家的學習有所協助,也希望大家多多支持。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved