從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
以下是一種使用 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); } } }