最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

WPF MVVM制作發(fā)送短信小按鈕

 更新時(shí)間:2016年11月11日 16:02:53   作者:眾尋  
這篇文章主要為大家詳細(xì)介紹了WPF MVVM發(fā)送短信小按鈕的制作方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

最近做一個(gè)項(xiàng)目,因?yàn)樯婕暗阶?,因此需要發(fā)送短信,一般發(fā)送短信都有一個(gè)倒計(jì)時(shí)的小按鈕,因此,就做了一個(gè),在此做個(gè)記錄。

一、發(fā)送消息

  沒有調(diào)用公司的短信平臺,只是模擬前臺生成一串?dāng)?shù)字,將此串?dāng)?shù)字輸出一下。

  在這個(gè)部分寫了兩個(gè)類文件:一個(gè)是生成隨機(jī)數(shù),一個(gè)是模擬發(fā)送此數(shù)字的。

1、因?yàn)樯蓭孜浑S機(jī)數(shù),是必須要到項(xiàng)目上線之前才能定的,因此,寫了一個(gè)帶參數(shù)的函數(shù),如下 

  /// <summary>
  /// 生成隨機(jī)驗(yàn)證碼
  /// </summary>
  public static class RandomCode
  {
    /// <summary>
    /// 返回一個(gè)N位驗(yà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ā)送此串?dāng)?shù)字。

  這個(gè)類里面用了兩個(gè)Timer函數(shù),一個(gè)是用作Button的倒數(shù)顯示的,另一個(gè)是用作保存這個(gè)驗(yàn)證碼時(shí)長的。

  在記錄驗(yàn)證碼的同時(shí),還需要記錄發(fā)送驗(yàn)證碼的手機(jī)號,以防止,用戶用第一個(gè)手機(jī)號點(diǎn)擊了發(fā)送驗(yàn)證碼后,把手機(jī)號部分修改為其他的手機(jī)號。 

public class SendRandomCode : ViewModelBase
  {
    private int _interval;//記錄倒計(jì)時(shí)長
    private string idCode;//在規(guī)定時(shí)間內(nèi)保存驗(yàn)證碼
    private int idCodeTime;//設(shè)置驗(yàn)證碼的有效時(shí)間(秒)
    private int idCodeNum = 6;//設(shè)置驗(yàn)證碼的位數(shù)

    public void GetCode(string phoneNum)
    {
      //獲取驗(yàn)證碼
      timerSend = new Timer(1000);
      timerSend.AutoReset = true;
      timerSend.Elapsed += Timer_Elapsed;
      _interval = SecondNum;
      timerSend.Start();

      //在驗(yàn)證碼有效期內(nèi),再次請求驗(yàn)證碼,需要先關(guān)閉上一次的
      if (timerTime != null)
      {
        timerTime.Close();
        timerTime.Dispose();
      }
      //驗(yàn)證碼的有效期
      timerTime = new Timer(1000);
      timerTime.AutoReset = true;
      timerTime.Elapsed += TimerTime_Elapsed;
      timerTime.Start();
      idCodeTime = SaveTime;
      IdCode = RandomCode.RandomCodeCommand(idCodeNum);
      PhoneNum = phoneNum;
    }

    #region 獲取驗(yàn)證碼倒計(jì)時(shí)
    Timer timerSend;
    Timer timerTime;
    private void Timer_Elapsed(object sender, ElapsedEventArgs e)
    {
      BtnIsEnable = false;
      BtnContent = "(" + (_interval--) + ")秒后再次獲取驗(yàn)證碼";

      if (_interval <= -1)
      {
        BtnIsEnable = true;
        BtnContent = "獲取驗(yàn)證碼";
        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 字段
    //*************************************************************************************************//上線時(shí)需要修改
    private int secondNum = 30;//設(shè)置倒計(jì)時(shí)長
    private int saveTime = 60;//設(shè)置保存驗(yàn)證碼時(shí)長
                 //*************************************************************************************************//
    private string btnContent = "獲取驗(yàn)證碼";//設(shè)置獲取驗(yàn)證碼按鈕顯示的名稱
    private bool btnIsEnable = true;//設(shè)置獲取驗(yàn)證碼按鈕是否可用

    private string phoneNum;//記錄是否是發(fā)送驗(yàn)證碼的手機(jī)號
    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="手機(jī)號"/>
      <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="驗(yàn)證碼"/>
      <TextBox Text="{Binding IdentifyCode}" Height="20" Width="100"/>
      <Button Content="提交" Command="{Binding Submit}" Height="20" Width="120"/>
    </StackPanel>
  </Grid>

三、VM頁面代碼  

  VM頁面沒有什么特別的,就是聲明了一些字段,

  特別注意的是,由于前臺的XAML頁面上的發(fā)送短信按鈕是需要倒計(jì)時(shí)的,因此Button的Content和IsEnable需要綁定到SendRandomCode這個(gè)類上,所以需要在VM下聲明一下這個(gè)類 

public class BingVM: ViewModelBase
  {
    #region 界面字段
    private string phoneNum;//手機(jī)號
    private string identifyCode;//驗(yàn)證碼
    public string PhoneNum
    {
      get
      {
        return phoneNum;
      }

      set
      {
        phoneNum = value;
        RaisePropertyChanged("PhoneNum");
      }
    }

    public string IdentifyCode
    {
      get
      {
        return identifyCode;
      }

      set
      {
        identifyCode = value;
        RaisePropertyChanged("IdentifyCode");
      }
    }
    #endregion

    #region 為獲取驗(yàn)證碼按鈕設(shè)置content和isEnable用的
    SendRandomCode src = new SendRandomCode();
    public SendRandomCode Src
    {
      get { return src; }
      set
      {
        src = value;
      }
    }
    #endregion

    private RelayCommand sendCode;//獲取驗(yàn)證碼

    public RelayCommand SendCode
    {
      get
      {
        return sendCode ?? (sendCode = new RelayCommand(
          () =>
          {
            if (!string.IsNullOrEmpty(PhoneNum))
            {
              src.GetCode(PhoneNum);
            }
            else
            {
              MessageBox.Show("手機(jī)號不能為空!");
            }

          }));
      }
    }
    private RelayCommand submit;

    public RelayCommand Submit
    {
      get
      {
        return submit ?? (submit = new RelayCommand(
          () =>
          {
            if (IdentifyCode == src.IdCode && PhoneNum == src.PhoneNum)
            {
              MessageBox.Show("驗(yàn)證成功");
            }
            else
            {
              MessageBox.Show("驗(yàn)證失敗");
            }
          }));
      }
    }

  }


四、效果展示

上面是成功的效果圖。

驗(yàn)證失敗的情況如下:

1、如果在發(fā)送驗(yàn)證碼的過程中,把手機(jī)號修改了,填入原有的驗(yàn)證碼

2、如果輸入的驗(yàn)證碼不是程序輸出的驗(yàn)證碼

3、時(shí)間超過了驗(yàn)證碼的保存時(shí)間

 BUG修復(fù):

剛才在測試的過程中發(fā)現(xiàn)了一個(gè)問題,由于我們做的主程序是調(diào)用模塊的DLL文件生成磁貼的,而主程序的返回按鈕,不會關(guān)閉掉當(dāng)前磁貼的所有線程,導(dǎo)致當(dāng)返回再進(jìn)入此磁貼時(shí),再次點(diǎn)擊發(fā)送按鈕,則會再次出現(xiàn)一個(gè)驗(yàn)證碼,解決方式很簡單:修改SendRandomCode代碼,在Timer timerTime;前加static,是其成為靜態(tài)的。這樣再次點(diǎn)擊時(shí),就是知道線程已存在,先關(guān)閉再發(fā)送。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#調(diào)用VB進(jìn)行簡繁轉(zhuǎn)換的方法

    C#調(diào)用VB進(jìn)行簡繁轉(zhuǎn)換的方法

    這篇文章主要介紹了C#調(diào)用VB進(jìn)行簡繁轉(zhuǎn)換的方法,通過調(diào)用VB的動態(tài)鏈接庫實(shí)現(xiàn)繁簡轉(zhuǎn)換的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-02-02
  • C#連接SQL Server的實(shí)現(xiàn)方法

    C#連接SQL Server的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于C#連接SQL Server的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-12-12
  • 基于Unity Line Renderer組件的常用屬性說明

    基于Unity Line Renderer組件的常用屬性說明

    這篇文章主要介紹了基于Unity Line Renderer組件的常用屬性說明,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • C#根據(jù)權(quán)重抽取隨機(jī)數(shù)

    C#根據(jù)權(quán)重抽取隨機(jī)數(shù)

    最近在開發(fā)過程中遇到一個(gè)需要做帶權(quán)隨機(jī)的處理,本文主要介紹了C#根據(jù)權(quán)重抽取隨機(jī)數(shù),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C#中整理了幾種字符串截取方法小結(jié)

    C#中整理了幾種字符串截取方法小結(jié)

    本文給大家整理了幾種字符串截取方法,?(Substring);(Remove);(Replace)方法和split方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • C#實(shí)現(xiàn)Excel合并單元格數(shù)據(jù)導(dǎo)入數(shù)據(jù)集詳解

    C#實(shí)現(xiàn)Excel合并單元格數(shù)據(jù)導(dǎo)入數(shù)據(jù)集詳解

    這篇文章主要為大家詳細(xì)介紹了C#如何實(shí)現(xiàn)Excel合并單元格數(shù)據(jù)導(dǎo)入數(shù)據(jù)集,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • 關(guān)于C# 4.0新特性“缺省參數(shù)”的實(shí)現(xiàn)詳解

    關(guān)于C# 4.0新特性“缺省參數(shù)”的實(shí)現(xiàn)詳解

    這篇文章主要給大家介紹了關(guān)于C# 4.0新特性“缺省參數(shù)”的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用C# 4.0具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • C#使用AutoResetEvent實(shí)現(xiàn)同步

    C#使用AutoResetEvent實(shí)現(xiàn)同步

    這篇文章主要為大家詳細(xì)介紹了C#使用AutoResetEvent實(shí)現(xiàn)同步的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • 判斷圖片-判斷位圖是否是黑白圖片的方法

    判斷圖片-判斷位圖是否是黑白圖片的方法

    近來工作需要判斷圖片否是是彩色的,由于是十萬張以上的大批量理處,所以通過序程來動自判斷。
    2013-05-05
  • C#中間語言及ILDASM工具用法

    C#中間語言及ILDASM工具用法

    這篇文章介紹了C#中間語言及ILDASM工具用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-01-01

最新評論

定陶县| 兰州市| 甘南县| 襄垣县| 德保县| 法库县| 海南省| 库尔勒市| 北辰区| 鄂温| 大兴区| 陵川县| 礼泉县| 拉萨市| 甘南县| 淮南市| 和平区| 慈溪市| 东方市| 凯里市| 和顺县| 农安县| 临安市| 准格尔旗| 获嘉县| 洪雅县| 伊通| 玉门市| 滦南县| 十堰市| 板桥市| 天柱县| 定南县| 怀宁县| 新疆| 珲春市| 天长市| 大荔县| 淅川县| 潜山县| 新乡县|