自定义密码文本框c# Windows应用程序

本文关键字:Windows 应用程序 密码 文本 自定义 | 更新日期: 2023-09-27 17:50:43

我想在c#应用程序中实现一个自定义密码文本框。. net默认为我提供这些属性。

 - PasswordChar
 - UseSystemPasswordChar

然而,上面的选项不会为我工作,因为我想实现一个自定义密码文本框,这将允许我输入字母数字字符,但行为方式类似于Android文本框控件。即我必须显示输入的字符几毫秒,然后使用"asterix"或任何其他密码字符屏蔽它。

为了实现这一点,我目前是这样处理的,但我认为这不是最优的解决方案。

private void txtPassword_TextChanged(object sender, EventArgs e)
    {
        if (timer == null)
        {
            timer = new System.Threading.Timer(timerCallback, null, 500, 150);
        }
        int num = this.txtPassword.Text.Count();
        if (num > 1)
        {
            StringBuilder s = new StringBuilder(this.txtPassword.Text);
            s[num - 2] = '*';
            this.txtPassword.Text = s.ToString();
            this.txtPassword.SelectionStart = num;
        }
    }
    public void Do(object state)
    {
        int num = this.txtPassword.Text.Count();
        if (num > 0)
        {
            StringBuilder s = new StringBuilder(this.txtPassword.Text);
            s[num - 1] = '*';
            this.Invoke(new Action(() =>
            {
                this.txtPassword.Text = s.ToString();
                this.txtPassword.SelectionStart = this.txtPassword.Text.Count();
                if (timer != null)
                {
                    timer.Dispose();
                }
                timer = null;
            }));
        }
    }

在构造函数

中调用
timerCallback = new TimerCallback(Do);

我很确定这可以更容易或更有效地完成。如有任何意见,敬请垂询。

谢谢VATSAG

自定义密码文本框c# Windows应用程序

首先,实现自定义安全控制通常不是一个好主意,除非您100%知道自己在做什么。如果你使用的是WPF,你可以有一个很好的和方便的方式来预览密码的PasswordBox控件的密码显示按钮。

您现有的代码可以在许多方面进行改进,最明显的是:

  1. 替换
  2. if (str.Length == 1)…

((TextBox)sender).Text=new string('*', str.Length);
  • 使用环境。换行而不是''n'。(为什么你要把它存储在密码数组中?)

  • 在事件处理程序中使用布尔变量来禁用它的逻辑,而不是每次都附加'detaching事件处理程序

  • 使用Timer代替thread . sleep()阻塞UI线程

  • 试试这个

    在你输入下一个字符之前,第一个字符没有被更改,但我将把这个问题留给你调试:);)

    而不是使用System.Threading。定时器,我使用了windows。forms。Timer

    更简单:)

    public partial class Form1 : Form
    {
        Timer timer = null;
        public Form1()
        {
            InitializeComponent();
            timer = new Timer();
            timer.Interval = 250;
            timer.Tick += Timer_Tick;
        }
        private void Timer_Tick(object sender, EventArgs e)
        {
            timer.Enabled = false;
            int num = this.txtPassword.Text.Count();
            if (num > 0)
            {
                StringBuilder s = new StringBuilder(this.txtPassword.Text);
                s[num - 1] = '*';
                this.Invoke(new Action(() =>
                {
                    this.txtPassword.Text = s.ToString();
                    this.txtPassword.SelectionStart = this.txtPassword.Text.Count();
                }));
            }
        }
        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            int num = this.txtPassword.Text.Count();
            if (num > 1)
            {
                StringBuilder s = new StringBuilder(this.txtPassword.Text);
                s[num - 2] = '*';
                this.txtPassword.Text = s.ToString();
                this.txtPassword.SelectionStart = num;
                timer.Enabled = true;
            }
        }
    }