WPF从CodeBehind设置PasswordBox

时间:2017-06-15 00:29:53

标签: c# wpf

我有一个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? (注意:我没有任何代码可以显示,因为目前大部分/全部都是理论代码)

1 个答案:

答案 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);
    }
相关问题