我有一个PasswordBox
,但是如果用户输入了太多字符,或输入了他们不应该拥有的字符,或者其他一些第三件事,我需要进行更改,就好像它从不发生了。例如:最大长度为5,但输入5个字符后,用户输入第6个字符。我想删除第6个字符。
我现在已经找了几个小时,但我找到的最接近的是this SO question。答案的第一行是,"你不能。" 如果情况如此,那就这样吧。但是,对我而言,感觉必须要有一些方法来做到这一点。
我尝试了很多方法,但无济于事。 PasswordBox
没有像TextBox这样的Undo
方法。尝试保留DependencyProperty
,并使用OnDPChanged,重置给定e.OldValue
的DP,但这与PasswordBox分开。我甚至考虑保留m_oldPassword
变量,但正如链接的帖子所说,"你不能。" 。
理论上,我可以按照MyPasswordBox.Password = MyPasswordBox.Password.SubString(0, passLen - 1);
但是1的方式做一些事情,出于安全考虑,我不想暴露正常的字符串,2,它不会永远是最后一个字符这将是问题,用户可能在中间输入了一些东西。
官方提问:如何在我的代码隐藏中使用PasswordBox
重置SecureString
?
(注意:我没有任何代码可以显示,因为目前大部分/全部都是理论代码)
答案 0 :(得分:1)
PasswordBox支持MaxLength属性来限制字符和KeyDown事件,您可以在其中设置后面代码中的规则。
XAML
<PasswordBox MaxLength="5" KeyDown="PasswordBox_KeyDown"/>
背后的代码
public partial class MainWindow : Window
{
public MainWindow()
{
this.InitializeComponent();
}
private void PasswordBox_KeyDown(object sender, KeyEventArgs e)
{
// Put your rules here - Example rejects the period key
if (e.Key == Key.OemPeriod)
e.Handled = true;
}
}
最后,虽然您无法直接设置SecurePassword属性,但可以设置Password属性。我知道您不希望在应用程序中将密码作为纯文本。因此,使用加密值和写入逻辑来解密该值并将其分配给Password属性。
private void ResetButton_OnClick(object sender, RoutedEventArgs e)
{
PasswordBox.Clear();
PasswordBox.Password = DecryptSavedPassword(_encryptedPassword);
}