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,是其成为静态的。这样再次点击时,就是知道线程已存在,先关闭再发送。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • WPF微信聊天和通讯录按钮样式代码分享

    一.先用Path画一下轮廓 <Path Stroke="Red" StrokeThickness="1" Margin="10" StrokeDashCap="Round"> <Path.Data> <GeometryGroup> <PathGeometry Figures="M 4,40 A 16,13 0 1 1 10,45 L 3,48 Z" /> &l

  • WPF中button按钮同时点击多次触发click解决方法

    解决WPF中button按钮同时点击多次触发click的方法,供大家参考,具体内容如下 DateTime lastClick = DateTime.Now; object obj = new object(); int i = 0; private void Button_Click(object sender, RoutedEventArgs e) { this.IsEnabled = false; var t = (DateTime.Now - lastClick).TotalMillise

  • WPF图片按钮的实现方法

    本文实例为大家分享了WPF图片按钮的实现代码,供大家参考,具体内容如下 直接代码 public class ImageButton : System.Windows.Controls.Button { /// <summary> /// 图片 /// </summary> public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("Image", t

  • WPF MVVM制作发送短信小按钮

    最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录. 一.发送消息 没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一下. 在这个部分写了两个类文件:一个是生成随机数,一个是模拟发送此数字的. 1.因为生成几位随机数,是必须要到项目上线之前才能定的,因此,写了一个带参数的函数,如下 /// <summary> /// 生成随机验证码 /// </summary> public static class

  • Android实现发送短信验证码倒计时功能示例

    一.简介: 开发中在用户注册或找回密码之类的功能,经常会遇到获取短信验证码,获取验证码后需要等待1分钟倒计时,这段时间是不能再次发送短信请求的. 效果图: 二.实现步骤: 1.一个关键类:CountDownTimer(Android系统自带的倒计时功能类) public class CountDownTimerUtils extends CountDownTimer { private TextView mTextView; //显示倒计时的文字 /** * @param textView Th

  • JS实现发送短信验证后按钮倒计时功能(防止刷新倒计时失效)

    应用场景 在开发"发送短信验证"功能时候,要解决一个问题,防止恶意或频繁发送短信验证码问题.一般原理是"当点击发送按钮时,发送ajax请求到服务器发送短信验证码,成功则把发送按钮设置为不可点击,并且调用定时器,按钮显示倒计时".如果就这样不对倒计时存储做处理,那么当刷新页面,会出现倒计时失效,按钮可点击.提供以下解决方案: 利用cookie存储倒计时 利用HTML5的localStorage 存储倒计时 利用cookie存储倒计时 发送成功后把剩余倒计时存储到coo

  • Android使用Intent的Action和Data属性实现点击按钮跳转到拨打电话和发送短信界面

    场景 点击拨打电话按钮,跳转到拨打电话页面 点击发送短信按钮,跳转到发送短信页面 注: 实现 将布局改为LinearLayout,并通过android:orientation="vertical">设置为垂直布局,然后添加id属性. 然后添加两个按钮,并设置Id属性与显示文本. <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="

  • 微信小程序之发送短信倒计时功能

    点击后 代码 <form bindsubmit="formSubmit" bindreset="formReset"> <view class="fidpas"> <input type="number" class="fidpas_inp"placeholder-class="lgin_place" placeholder="请输入手机号&quo

  • Android开发中实现发送短信的小程序示例

    上图为代码结构图. 现在我们看下具体的代码. Send.java package cn.com.sms.send; import java.util.ArrayList; import java.util.Iterator; import android.app.Activity; import android.app.PendingIntent; import android.content.Intent; import android.os.Bundle; import android.te

  • 详解如何使用微信小程序云函数发送短信验证码

    其实微信小程序前端和云端都是可以调用短信平台接口发送短信的,使用云端云函数的好处是无需配置域名,也没有个数限制. 本文使用的是榛子云短信平台(http://smsow.zhenzikj.com) ,SDK下载: http://smsow.zhenzikj.com/doc/sdk.html 1.安装 下载后的SDK在cloudfunctions文件夹下会包含3个云函数文件夹,如下: 由于目前IDE没有云函数导入功能,您需要手工创建同名的云函数,然后将云函数下的文件手工拷进去 注:下载的SDK是一个

  • 微信小程序发送短信验证码完整实例

    微信小程序注册完整实例,发送短信验证码,带60秒倒计时功能,无需服务器端.效果图: 代码: index.wxml <!--index.wxml--> <view class="container"> <view class='row'> <input placeholder='请输入姓名' bindinput='bindNameInput'/> </view> <view class='row'> <inpu

  • 微信小程序实现发送短信验证码倒计时

    本文实例为大家分享了微信小程序发送短信验证码倒计时的具体代码,供大家参考,具体内容如下 效果图 WXML文件 <view class="container"> <view class="userinfo"> <image class="userinfo-avatar" src="../../images/timg.jpg" mode="cover"></image&

  • js发送短信倒计时的简单实现方法

    如下所示: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <meta charset="utf-8"> &l

随机推荐