2017-06-15 57 views
0

我有一個PasswordBox,但是如果用戶輸入的字符太多,或者輸入了他們不應該擁有的字符,或者其他第三個字符,我需要這個更改以表現它從未發生過。例如:最大長度爲5,但輸入5個字符後,用戶輸入第6個。我想刪除第6個字符。WPF在CodeBehind中設置密碼框

我一直在尋找幾個小時,但我發現最接近的東西是this SO question。答案的第一行是,「你不能。」如果事情是這樣,那就這樣吧。但是,對我來說,感覺就像有一些方法可以做到這一點。

我試過了很多方法,但無濟於事。 PasswordBox沒有像TextBox那樣的Undo方法。試着保留DependencyProperty,並使用OnDPChanged,重置給定e.OldValue,但它是獨立於PasswordBox的DP。我甚至認爲要保持m_oldPassword變量,但正如鏈接的帖子所說,「你不能。」

理論上,我可以按照MyPasswordBox.Password = MyPasswordBox.Password.SubString(0, passLen - 1);的方法做一些事情,但是1,我不想公開正常的字符串出於安全原因,2,它不會總是最後一個字符,會是問題,用戶可能在中間輸入了一些東西。

官方問題:如何在代碼隱藏中使用SecureString來重置PasswordBox? (注:我沒有任何代碼可以顯示,因爲大部分/所有這一切都是理論上的此刻)

+0

爲什麼你需要那個和其他人不需要? –

+0

你可以重述一下這個問題嗎?恐怕我不太明白你在問什麼。 –

+0

我的意思是如果別人不抱怨控制爲什麼你?如果你想要一個特殊的控制,然後創建你自己的客戶控制。 –

回答

2

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屬性。

private void ResetButton_OnClick(object sender, RoutedEventArgs e) 
    { 
     PasswordBox.Clear(); 
     PasswordBox.Password = DecryptSavedPassword(_encryptedPassword); 
    } 
+0

這可能會有所幫助,我會看到我可以做什麼。謝謝! –