[英]WPF Set PasswordBox from CodeBehind
我有一个PasswordBox
,但是如果用户输入了太多字符,或者输入了他们不应该输入的字符,或者其他第三件事,我需要进行更改以使其表现得好像从未发生过一样。 例如:最大长度为 5,但在输入 5 个字符后,用户输入了第 6 个字符。 我想删除第 6 个字符。
我已经找了几个小时了,但我发现的最接近的是这个 SO question 。 该答案的第一行是“你不能”。 如果事情就是这样,那就这样吧。 但是,对我来说,感觉必须有某种方法可以做到这一点。
我尝试了多种方法,但无济于事。 PasswordBox
没有像TextBox 那样的Undo
方法。 尝试保留DependencyProperty
并使用 OnDPChanged,在给定e.OldValue
的情况下重置 DP,但这与 PasswordBox 是分开的。 我什至想保留一个m_oldPassword
变量,但正如链接的帖子所说, “你不能。” .
从理论上讲,我可以按照MyPasswordBox.Password = MyPasswordBox.Password.SubString(0, passLen - 1);
的方式做一些事情。 但是 1,出于安全原因,我不想公开普通字符串,2,问题并不总是最后一个字符,用户可能在中间输入了一些内容。
官方问题:如何在代码隐藏中使用SecureString
重置PasswordBox
? (注意:我真的没有任何代码可以展示,因为目前大部分/所有这些都是理论上的)
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);
}
如果您需要设置/覆盖密码(除了清除密码),我在 OP 中添加了一个问题的答案,该问题显示了如何使用 SecureString 设置 Password 属性,而无需先将其解密为 String . 它使用反射从 MethodInfo 调用私有 SetSecurePassword()(从 PasswordBox.Password setter 调用)或编译并缓存将执行此操作的委托。 (有关详细信息,请参阅https://stackoverflow.com/a/66918246/2240196 )
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.