【问题标题】:WPF PasswordChanged property not detecting backspace deleteWPF PasswordChanged 属性未检测到退格删除
【发布时间】:2019-11-16 12:01:00
【问题描述】:

我在密码框中使用 passwordchanged 属性:

 PasswordChanged="NewPWBox_PasswordChanged"

用于检测密码的“实时”更改并更新我的其他控件,以显示密码的复杂程度。 它工作得很好。

唯一的问题是当我标记整个文本并用退格键删除它时,它不会检测到字符串的变化,而我的其他控件不会更新。

我真的不是前端人员,无法在任何地方找到解决此问题的方法。

显示密码复杂度的功能:

private void NewPWBox_PasswordChanged(object sender, RoutedEventArgs e)
    {

        string NewPass = NewPWBox.Password;

        PasswordScore passwordStrengthScore = PasswordAdvisor.CheckStrength(NewPass);

        switch (passwordStrengthScore)
        {
            case PasswordScore.VeryWeak:

                if(passwordStrengthScore == PasswordScore.VeryWeak)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                }

                //hide others
                Weak_Grid.Visibility = Visibility.Hidden;
                Weak_Label.Visibility = Visibility.Hidden;
                Medium_Grid.Visibility = Visibility.Hidden;
                Medium_Label.Visibility = Visibility.Hidden;
                Strong_Grid.Visibility = Visibility.Hidden;
                Strong_Label.Visibility = Visibility.Hidden;
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.Weak:

                if(passwordStrengthScore == PasswordScore.Weak)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                }

                //hide others
                Medium_Grid.Visibility = Visibility.Hidden;
                Medium_Label.Visibility = Visibility.Hidden;
                Strong_Grid.Visibility = Visibility.Hidden;
                Strong_Label.Visibility = Visibility.Hidden;
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.Medium:

                if(passwordStrengthScore == PasswordScore.Medium)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                    Medium_Grid.Visibility = Visibility.Visible;
                    Medium_Label.Visibility = Visibility.Visible;
                }

                //hide others
                Strong_Grid.Visibility = Visibility.Hidden;
                Strong_Label.Visibility = Visibility.Hidden;
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.Strong:

                if(passwordStrengthScore == PasswordScore.Strong)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                    Medium_Grid.Visibility = Visibility.Visible;
                    Medium_Label.Visibility = Visibility.Visible;
                    Strong_Grid.Visibility = Visibility.Visible;
                    Strong_Label.Visibility = Visibility.Visible;
                }

                //hide others
                VS_Grid.Visibility = Visibility.Hidden;
                VS_Label.Visibility = Visibility.Hidden;

                break;
            case PasswordScore.VeryStrong:

                if(passwordStrengthScore == PasswordScore.VeryStrong)
                {
                    VW_Grid.Visibility = Visibility.Visible;
                    VW_Label.Visibility = Visibility.Visible;
                    Weak_Grid.Visibility = Visibility.Visible;
                    Weak_Label.Visibility = Visibility.Visible;
                    Medium_Grid.Visibility = Visibility.Visible;
                    Medium_Label.Visibility = Visibility.Visible;
                    Strong_Grid.Visibility = Visibility.Visible;
                    Strong_Label.Visibility = Visibility.Visible;
                    VS_Grid.Visibility = Visibility.Visible;
                    VS_Label.Visibility = Visibility.Visible;
                }
                break;
        }
    }

这里是如何计算复杂性的:

    public enum PasswordScore
    {
        Blank = 0,
        VeryWeak = 1,
        Weak = 2,
        Medium = 3,
        Strong = 4,
        VeryStrong = 5
    }

    public class PasswordAdvisor
    {

        public static PasswordScore CheckStrength(string password)
        {
            int score = 1;
            if (password.Length < 1)
                return PasswordScore.Blank;
            if (password.Length < 4)
                return PasswordScore.VeryWeak;

            if (password.Length >= 8)
                score++;
            if (password.Length >= 12)
                score++;
            if (Regex.IsMatch(password, @"[0-9]+(\.[0-9][0-9]?)?", RegexOptions.ECMAScript))   //number only //"^\d+$" if you need to match more than one digit.
                score++;
            if (Regex.IsMatch(password, @"^(?=.*[a-z])(?=.*[A-Z]).+$", RegexOptions.ECMAScript)) //both, lower and upper case
                score++;
            if (Regex.IsMatch(password, @"[!,@,#,$,%,^,&,*,?,_,~,-,£,(,)]", RegexOptions.ECMAScript)) //^[A-Z]+$
                score++;
            return (PasswordScore)score;
        }

我认为你不需要它,但只是为了确定我没有错过任何东西。

各位有什么想法吗?

谢谢和最好的问候,

约翰

【问题讨论】:

  • 尝试处理 KeyUp 事件。
  • @Eldar 即使使用退格键删除,也无法让属性检测更改?
  • 这取决于 PasswordChanged 事件的实现方式。当您按退格键或删除按钮时,他们可能不会触发它
  • “当我标记整个文本并用退格键删除它时,它不会检测到更改” - 无法重现。事件有效(我的项目针对 .NET 4.5.2 并在 Window 7 上运行)。 minimal reproducible example 需要
  • @ASh im .net 4.8 和 WIN10

标签: c# wpf passwordbox


【解决方案1】:

毕竟是健谈的 cmets: 在您的开关中放置一个默认情况并在这种情况下隐藏控件。

编辑:如果您将控件的数量减少到一个矩形和一个标签并更改颜色(如果需要,还可以更改大小,或渐变刷...)和标签的文本...如果密码框为空则隐藏。

它是如此简单、干净、面向未来,并且与绑定和验证更加解耦......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2021-01-26
    • 2012-03-16
    • 1970-01-01
    相关资源
    最近更新 更多