WPF MVVM制作发送短信小按钮_C#教程

最近做一个项目,因为涉及到注册,因此需要发送短信,一般发送短信都有一个倒计时的小按钮,因此,就做了一个,在此做个记录。

一、发送消息

  没有调用公司的短信平台,只是模拟前台生成一串数字,将此串数字输出一下。

  在这个部分写了两个类文件:一个是生成随机数,一个是模拟发送此数字的。

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

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索wpf
MVVM发送短信
发送短信按钮、wpf mvvm、wpf mvvm框架、wpf mvvm实例、wpf mvvmlight 教程,以便于您获取更多的相关知识。

时间: 2024-07-31 11:56:22

WPF MVVM制作发送短信小按钮_C#教程的相关文章

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

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

Android开发中实现发送短信的小程序示例_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

android-Android监听发送短信权限拒绝按钮的事件

问题描述 Android监听发送短信权限拒绝按钮的事件 如图,我想在用户点击拒绝按钮后弹出窗口提示用户,重新发送短信,监听异常的方法已经尝试过了,行不通,不明白我的意思的可以下载美丽说软件,点击一键注册后,发送短信,在权限选择界面点击拒绝,软件提示用户重新发送. 解决方案 你试试监听一些短信发送结果 解决方案二: 意见同楼上,获取短信发送结果,然后提示重新发送 解决方案三: 意见同楼上,获取短信发送结果,然后提示重新发送 解决方案四: 楼上说的对的,你可以通过广播监听发短信,返回失败就提示你要的

broadcastreceiver-自己做了一个接收发送短信的练习,但是一点发送按钮就报错,也接收不了信息。求大神

问题描述 自己做了一个接收发送短信的练习,但是一点发送按钮就报错,也接收不了信息.求大神 帮帮小弟,良辰必有重谢!!!targetSDK23,minSDK18 package com.example.think.smstest; import android.annotation.TargetApi; import android.app.PendingIntent; import android.content.BroadcastReceiver; import android.content

发送短信按钮倒计时服务器端支持

发送短信按钮倒计时服务器端支持 发送成功之后才计时:     Java代码   /***       * 服务器端启动倒计时,即记录时间戳       *       * @param mobile       */       private void setSMSLimit(String mobile) {           HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRe

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

js发送短信倒计时的简单实现方法_javascript技巧

如下所示: <!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

[SMS&amp;WAP]实例讲解制作OTA短信来自动配置手机WAP书签[附源码]

[SMS&WAP]实例讲解制作OTA短信来自动配置手机WAP书签 编写者 日期 关键词 郑昀@ultrapower 2005-9-5 Sms wap ota 书签 空中下载手机上网设置 WDP WSP WBXML 源代码:otasms.rar  (不能下载的话,请来信) 空中下载(OTA)的概念 OTA,即Over The Air,国内翻译为空中下载. OTA标准由爱立信和诺基亚共同制订.OTA涵盖了许多范围,比如Kjava中的应用程序下载也是通过OTA.我们这篇文章主要讲的是,通过短信方式空中

基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)_jquery

相关阅读: 基于JS实现发送短信验证码后的倒计时功能(无视页面刷新,页面关闭不进行倒计时功能) 今天测试提了一个bug,发送短信倒计时功能,要求关闭页面也要进行倒计时.这想到了,当年我参与的周杰伦演唱会的先付先抢功能.与之类似,只不过,那个项目的时间都是服务器时间,本人目前有点偷懒,就用客户端的时间了. 一下是完整的代码,只不过在客户端的效率不是很好. <!doctype html> <html lang="en"> <head> <meta