<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      WPF自定義控件--模擬手機(jī)密碼輸入控件,在輸入時(shí)顯示最后一個(gè)輸入密碼字符

      using System.Threading;
      using System.Threading.Tasks;
      using System.Windows;
      using System.Windows.Controls;
      
      namespace PasswordTest
      {
          /// <summary>
          /// 顯示最后一個(gè)字符的密碼輸入框
          /// </summary>
          public class BlinkPasswordBox : TextBox
          {
              #region DependencyProperty
      
              public static readonly DependencyProperty PasswordCharProperty = DependencyProperty.RegisterAttached("PasswordChar", typeof(char), typeof(BlinkPasswordBox), new FrameworkPropertyMetadata('●'));
      
              /// <summary>
              /// 密文字符
              /// </summary>
              public char PasswordChar
              {
                  get { return (char)GetValue(PasswordCharProperty); }
                  set { SetValue(PasswordCharProperty, value); }
              }
      
              public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(BlinkPasswordBox), new UIPropertyMetadata(""));
              /// <summary>
              /// 密碼字符
              /// </summary>
              public string Password
              {
                  get { return (string)GetValue(PasswordProperty); }
                  set { SetValue(PasswordProperty, value); }
              }
              #endregion
      
              #region Properties
              /// <summary>
              /// 最后的光標(biāo)位置
              /// </summary>
              private int mLastStart = 0;
              /// <summary>
              /// 明文消失的時(shí)間
              /// </summary>
              private int mDelay = 1000;
              /// <summary>
              /// 定時(shí)Token
              /// </summary>
              private CancellationTokenSource mWaitToken = new CancellationTokenSource();
              /// <summary>
              /// 密碼
              /// </summary>
              private string mPassword = string.Empty;
              /// <summary>
              /// 正在更新文本
              /// </summary>
              private bool IsUpdating;
              /// <summary>
              /// 顯示的文本
              /// </summary>
              private string ShowText
              {
                  get { return base.Text; }
                  set
                  {
                      IsUpdating = true;
                      base.Text = value;
                      IsUpdating = false;
                  }
              }
              /// <summary>
              /// 密碼設(shè)置
              /// </summary>
              public new string Text
              {
                  get { return mPassword; }
                  set
                  {
                      mPassword = value;
                      this.ShowText = new string(PasswordChar, value.Length);
                  }
              }
              #endregion
              #region protected override
              protected override void OnTextChanged(TextChangedEventArgs e)
              {
                  if (IsUpdating == true)
                      return;
      
                  string currentText = this.ShowText;
                  int start = this.SelectionStart;
      
                  RemoveChar(currentText, start);
      
                  SetShowText(currentText, start);
      
                  base.OnTextChanged(e);
              }
              /// <summary>
              /// 設(shè)置要顯示的文本
              /// </summary>
              /// <param name="e"></param>
              /// <param name="currentText"></param>
              /// <param name="start"></param>
              private void SetShowText(string currentText, int start)
              {
                  if (!string.IsNullOrEmpty(currentText))
                  {
                      string addChar = string.Empty;
                      for (int i = 0; i < currentText.Length; i++)
                      {
                          if (currentText[i] != PasswordChar)
                          {
                              addChar = currentText[i].ToString();
                              if (this.ShowText.Length == mPassword.Length)
                              {
                                  // 修改字符
                                  mPassword = mPassword.Remove(i, 1).Insert(i, currentText[i].ToString());
                              }
                              else
                              {
                                  // 增加字符
                                  mPassword = mPassword.Insert(i, currentText[i].ToString());
      
                              }
                          }
                      }
                      Password = mPassword;
                      this.ShowText = new string(PasswordChar, mPassword.Length);
                      if (!string.IsNullOrEmpty(addChar) && start > 0)
                      {
                          ShowText = ShowText.Remove(start - 1, 1).Insert(start - 1, addChar);
                          WaitChange();
                      }
                      this.SelectionStart = start;
                  }
              }
              /// <summary>
              /// 刪除字符
              /// </summary>
              /// <param name="currentText"></param>
              /// <param name="start"></param>
              private void RemoveChar(string currentText, int start)
              {
                  if (currentText.Length < mPassword.Length)
                  {
                      mPassword = mPassword.Remove(start, mPassword.Length - currentText.Length);
                      Password = mPassword;
                  }
              }
      
              #endregion
      
              #region Private Methods
              /// <summary>
              /// 等待明文自動(dòng)隱藏
              /// </summary>
              private async void WaitChange()
              {
                  try
                  {
                      mWaitToken.Cancel();
                      mWaitToken = new System.Threading.CancellationTokenSource();
                      await Task.Delay(mDelay, mWaitToken.Token);
                      mLastStart = this.SelectionStart;
                      this.ShowText = new string(PasswordChar, mPassword.Length);
                      this.SelectionStart = mLastStart;
                  }
                  catch
                  {
      
                  }
              }
              #endregion
          }
      }
      

        

      posted @ 2020-08-26 10:34  故事里的事那都不是事  閱讀(326)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲男人第一无码av网站| 午夜DY888国产精品影院| 国产精品无卡毛片视频| 久久精品国产一区二区三区| 国产成人精品永久免费视频| 成人看的污污超级黄网站免费| 永久免费av网站可以直接看的| 张掖市| 国产高清小视频一区二区| 成人亚欧欧美激情在线观看| 中国老妇xxxx性开放| 亚洲综合国产伊人五月婷| av色国产色拍| 河西区| 蜜臀午夜一区二区在线播放| 中文字幕在线不卡一区二区| 国内不卡不区二区三区| 亚洲欧美精品aaaaaa片| 日本精品一区二区不卡| 景泰县| 国产精品午夜福利免费看| 影音先锋人妻啪啪av资源网站| 欧美日韩国产图片区一区| 国产日女人视频在线观看| 午夜精品福利亚洲国产| 产综合无码一区| 国产高清国产精品国产专区| 国产精品国产三级国产试看| 在线观看潮喷失禁大喷水无码| 61精品人妻一区二区三区| 无码AV中文字幕久久专区| 中文字幕有码无码AV| 亚洲综合国产一区二区三区| 污网站在线观看视频| 国产女人看国产在线女人| 亚洲一区二区三区水蜜桃| 国产精品福利自产拍在线观看| 国产精品成| 亚洲国产精品一二三区| 亚洲精品国产自在久久| 亚洲国产成人久久综合区|