以下是一種使用 MVVM 模式的方法:
- 首先,在 ViewModel 中新增一個屬性來儲存密碼,我們可以使用 SecureString 型別。
// 密碼變數 private SecureString _password; // 密碼屬性,用於獲取和設定密碼 public SecureString Password { get { return _password; } set { // 如果新值與舊值不同 if (_password != value) { // 更新密碼 _password = value; // 觸發屬性更改通知,通知UI層密碼已更改 RaisePropertyChanged(nameof(Password)); } } }
- 建立一個附加屬性來處理 PasswordBox 的密碼變化,並將其繫結到 ViewModel 中的命令。
public ICommand PasswordChangedCommand => new DelegateCommand<object>(PasswordChanged); private void PasswordChanged(object parameter) { var passwordBox = parameter as PasswordBox; if (passwordBox != null) { // 設定 ViewModel 中的密碼屬性 Password = passwordBox.SecurePassword; } }
- 在 XAML 中,使用行為觸發器來觸發命令。
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
<PasswordBox x:Name="PasswordBox" Height="45" Margin="5" FontSize="20" FontWeight="Thin"> <i:Interaction.Triggers> <i:EventTrigger EventName="PasswordChanged"> <i:InvokeCommandAction Command="{Binding PasswordChangedCommand}" CommandParameter="{Binding ElementName=PasswordBox}" /> </i:EventTrigger> </i:Interaction.Triggers> </PasswordBox>
- 檢視密碼框的內容。
MessageBox.Show(SecureStringToString(Password));
/// <summary> /// 將 SecureString 型別的資料轉換為普通的字串型別。 /// </summary> /// <param name="secureString">要轉換的 SecureString 物件。</param> /// <returns>轉換後的字串,如果轉換失敗則返回空字串。</returns> private string SecureStringToString(SecureString secureString) { // 初始化指標 IntPtr ptr = IntPtr.Zero; try { // 將 SecureString 轉換為指標 ptr = Marshal.SecureStringToGlobalAllocUnicode(secureString); if (ptr != IntPtr.Zero) { // 將指標中的資料複製到一個普通的字串 return Marshal.PtrToStringUni(ptr); } else { return string.Empty; } } catch (Exception ex) { // 處理異常 Console.WriteLine($"轉換 SecureString 出錯:{ex.Message}"); return string.Empty; } finally { // 清除記憶體中的敏感資料 if (ptr != IntPtr.Zero) { Marshal.ZeroFreeGlobalAllocUnicode(ptr); } } }