【发布时间】: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