簡體   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