激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C# - WPF MVVM制作發送短信小按鈕

WPF MVVM制作發送短信小按鈕

2021-12-09 13:39眾尋 C#

這篇文章主要為大家詳細介紹了WPF MVVM發送短信小按鈕的制作方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

最近做一個項目,因為涉及到注冊,因此需要發送短信,一般發送短信都有一個倒計時的小按鈕,因此,就做了一個,在此做個記錄。

一、發送消息

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

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

1、因為生成幾位隨機數,是必須要到項目上線之前才能定的,因此,寫了一個帶參數的函數,如下 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// <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的倒數顯示的,另一個是用作保存這個驗證碼時長的。

  在記錄驗證碼的同時,還需要記錄發送驗證碼的手機號,以防止,用戶用第一個手機號點擊了發送驗證碼后,把手機號部分修改為其他的手機號。 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
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頁面代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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下聲明一下這個類 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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("驗證失敗");
            }
          }));
      }
    }
 
  }

四、效果展示

WPF MVVM制作發送短信小按鈕

上面是成功的效果圖。

驗證失敗的情況如下:

1、如果在發送驗證碼的過程中,把手機號修改了,填入原有的驗證碼

2、如果輸入的驗證碼不是程序輸出的驗證碼

3、時間超過了驗證碼的保存時間

 bug修復:

剛才在測試的過程中發現了一個問題,由于我們做的主程序是調用模塊的dll文件生成磁貼的,而主程序的返回按鈕,不會關閉掉當前磁貼的所有線程,導致當返回再進入此磁貼時,再次點擊發送按鈕,則會再次出現一個驗證碼,解決方式很簡單:修改sendrandomcode代碼,在timer timertime;前加static,是其成為靜態的。這樣再次點擊時,就是知道線程已存在,先關閉再發送。

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

原文鏈接:http://www.cnblogs.com/ZXdeveloper/p/4831672.html

延伸 · 閱讀

精彩推薦
  • C#深入解析C#中的交錯數組與隱式類型的數組

    深入解析C#中的交錯數組與隱式類型的數組

    這篇文章主要介紹了深入解析C#中的交錯數組與隱式類型的數組,隱式類型的數組通常與匿名類型以及對象初始值設定項和集合初始值設定項一起使用,需要的...

    C#教程網6172021-11-09
  • C#WPF 自定義雷達圖開發實例教程

    WPF 自定義雷達圖開發實例教程

    這篇文章主要介紹了WPF 自定義雷達圖開發實例教程,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下...

    WinterFish13112021-12-06
  • C#C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    C# 實現對PPT文檔加密、解密及重置密碼的操作方法

    這篇文章主要介紹了C# 實現對PPT文檔加密、解密及重置密碼的操作方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下...

    E-iceblue5012022-02-12
  • C#C#裁剪,縮放,清晰度,水印處理操作示例

    C#裁剪,縮放,清晰度,水印處理操作示例

    這篇文章主要為大家詳細介紹了C#裁剪,縮放,清晰度,水印處理操作示例,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    吳 劍8332021-12-08
  • C#C#實現XML文件讀取

    C#實現XML文件讀取

    這篇文章主要為大家詳細介紹了C#實現XML文件讀取的相關代碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    Just_for_Myself6702022-02-22
  • C#C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題實例

    這篇文章主要介紹了C#設計模式之Visitor訪問者模式解決長隆歡樂世界問題,簡單描述了訪問者模式的定義并結合具體實例形式分析了C#使用訪問者模式解決長...

    GhostRider9502022-01-21
  • C#C#通過KD樹進行距離最近點的查找

    C#通過KD樹進行距離最近點的查找

    這篇文章主要為大家詳細介紹了C#通過KD樹進行距離最近點的查找,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    帆帆帆6112022-01-22
  • C#Unity3D實現虛擬按鈕控制人物移動效果

    Unity3D實現虛擬按鈕控制人物移動效果

    這篇文章主要為大家詳細介紹了Unity3D實現虛擬按鈕控制人物移動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一...

    shenqingyu060520232410972022-03-11
主站蜘蛛池模板: 精品一区二区三区在线观看国产 | 夜夜夜操操操 | 成人国产精品一区二区毛片在线 | 日本精品久久久一区二区三区 | 国产一区成人 | 黑人一级片视频 | 中国女警察一级毛片视频 | 久草成人在线观看 | 99久久精品免费看国产四区 | 日本成人在线免费 | 欧美a级一区二区 | 在线亚洲欧美 | 中文区永久区 | 高清做爰免费无遮网站挡 | 成人 日韩 | 成人黄色短视频在线观看 | 欧美人xx | 久久3| 一区二区久久精品66国产精品 | 久久99精品国产自在现线 | 国产一级二级视频 | 亚洲精品成人久久久 | 精品国产一区二区三区免费 | 91美女视频在线观看 | 性大片免费看 | 久久97超碰 | 久久久亚洲欧美综合 | wwwxxx国产| 成人毛片网 | 国产精品久久久久久久久久妇女 | 在线观看免费视频麻豆 | avav在线播放 | 亚洲精品久久久久久久久久 | 一级免费黄色免费片 | 99精品视频免费 | 精品国产99久久久久久宅男i | 国产欧美日韩视频在线观看 | 欧美视频国产精品 | 成人午夜免费在线视频 | 国产精品久久久免费看 | 在线播放黄色片 |