繁体   English   中英

WPF 从代码隐藏设置密码框

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM