密码框在WPF中的使用
因为安全问题密码框本身不支持MVVM,所以需要附加属性类完成
附加属性---》密码框
密码框---》附加属性

添加附加属性
1 、创建附加属性
/// <summary>
/// 密码框帮助类 通过附加属性实现
/// </summary>
public static class C_PasswordBoxHelper
{
//附加行为来实现 PasswordBox 的绑定。
// 这通常涉及为 PasswordBox 创建一个附加行为,该行为可以监听 PasswordBox
// 的 PasswordChanged 事件,并通过事件处理器将其值传递给 ViewModel。
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.RegisterAttached("Password", //这个跟PasswordProperty 去掉属性
typeof(string),
typeof(C_PasswordBoxHelper),
new PropertyMetadata(string.Empty, OnPasswordPropertyChanged));
public static string GetPassword(DependencyObject obj)
{
return (string)obj.GetValue(PasswordProperty);
}
public static void SetPassword(DependencyObject obj, string value)
{
obj.SetValue(PasswordProperty, value);
}
/// <summary>
/// 附加属性发送改变时候
/// </summary>
/// <param name="d"></param>
/// <param name="e"></param>
public static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (sender is PasswordBox)
{
PasswordBox password = (PasswordBox)sender;
//可以在OnPasswordPropertyChanged方法中添加一个判断,
// 只有当密码框的密码与新的属性值不同时,才将密码框的密码设置为新的属性值。
// 这样可以避免在每次输入字符时重新设置密码,从而保持光标的位置不变。
// 通过添加这个判断,只有在密码框的密码与新的属性值不同时,才会将密码框的密码设置为新的属性值,从而避免光标跳到第一个字符前面的问题。
if (password.Password != e.NewValue?.ToString())// 初始化时候才会走到下面逻辑,平时更改都不会走到这个逻辑
{
password.PasswordChanged -= PasswordBox_PasswordChanged;
password.PasswordChanged += PasswordBox_PasswordChanged;
password.Password = e.NewValue?.ToString();
}
}
}
private static void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e)
{
if (sender is PasswordBox)
{
PasswordBox password = (PasswordBox)sender;
SetPassword(password, password.Password);
}
}
}
2 、在绑定的页面添加普通密码属性
private string mPwd;
/// <summary>
/// 登录密码
/// </summary>
public string Pwd
{
get { return mPwd; }
set { mPwd = value; RaisePropertyChanged(); }
}
3 、 使用
<!--密码-->
<PasswordBox
Margin="20,0"
local:C_PasswordBoxHelper.Password="{Binding Pwd,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
FontSize="16" Foreground="#555" Height="40" Grid.Row="1">
<PasswordBox.InputBindings>
<KeyBinding Key="Enter" Command="{Binding LoginClick}" CommandParameter="{Binding ElementName=wlogin}" />
</PasswordBox.InputBindings>
</PasswordBox>
这样就实现了MVVM 中密码框的运用

浙公网安备 33010602011771号