public static class LoginPasswordBoxHelper
{
private static bool _isUpdatingPassword = false;
public static string GetPassword(DependencyObject obj)
{
return (string)obj.GetValue(PasswordProperty);
}
public static void SetPassword(DependencyObject obj, string value)
{
obj.SetValue(PasswordProperty, value);
}
public static readonly DependencyProperty PasswordProperty =
DependencyProperty.RegisterAttached("Password", typeof(string), typeof(LoginPasswordBoxHelper),
new PropertyMetadata(string.Empty, OnPasswordPropertyChanged));
public static bool GetIsPasswordBindingEnable(DependencyObject obj)
{
return (bool)obj.GetValue(IsPasswordBindingEnableProperty);
}
public static void SetIsPasswordBindingEnable(DependencyObject obj, bool value)
{
obj.SetValue(IsPasswordBindingEnableProperty, value);
}
public static readonly DependencyProperty IsPasswordBindingEnableProperty =
DependencyProperty.RegisterAttached("IsPasswordBindingEnable", typeof(bool), typeof(LoginPasswordBoxHelper),
new FrameworkPropertyMetadata(OnIsPasswordBindingEnabledChanged));
private static void OnIsPasswordBindingEnabledChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
if (obj is PasswordBox passwordBox)
{
passwordBox.PasswordChanged -= PasswordBoxPasswordChanged;
if ((bool)e.NewValue)
{
passwordBox.PasswordChanged += PasswordBoxPasswordChanged;
// Initialize PasswordProperty value to PasswordBox's current password
SetPassword(passwordBox, passwordBox.Password);
}
}
}
private static void OnPasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
if (d is PasswordBox passwordBox)
{
passwordBox.PasswordChanged -= PasswordBoxPasswordChanged;
if (!_isUpdatingPassword && passwordBox.Password != (string)e.NewValue)
{
passwordBox.Password = (string)e.NewValue ?? string.Empty;
}
passwordBox.PasswordChanged += PasswordBoxPasswordChanged;
}
}
private static void PasswordBoxPasswordChanged(object sender, RoutedEventArgs e)
{
if (sender is PasswordBox passwordBox)
{
_isUpdatingPassword = true;
if (GetPassword(passwordBox) != passwordBox.Password)
{
SetPassword(passwordBox, passwordBox.Password);
}
_isUpdatingPassword = false;
}
}
}
public class BoolToContentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool b && b)
{
return "显示密码";
}
else
{
return "隐藏密码";
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return new object();
}
}
前端代码
<Window.Resources>
<cvt:BoolToContentConverter x:Key="btcc" />
</Window.Resources>
<StackPanel
Grid.Row="2"
HorizontalAlignment="Center"
Orientation="Horizontal">
<Grid>
<TextBox
x:Name="txtBox2"
Width="200"
Height="35"
Margin="0,50,0,0"
VerticalContentAlignment="Center"
Text="{Binding Pwd, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Visibility="{Binding TxtVis}" />
<PasswordBox
x:Name="passTxt2"
Width="200"
Height="35"
Margin="0,50,0,0"
VerticalContentAlignment="Center"
deu:LoginPasswordBoxHelper.IsPasswordBindingEnable="True"
deu:LoginPasswordBoxHelper.Password="{Binding Pwd, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Visibility="{Binding PwdVis}" />
</Grid>
<ToggleButton
Height="35"
Margin="20,50,0,0"
Command="{Binding TBtnCmdCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked}"
Content="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsChecked, Converter={StaticResource btcc}}"
Style="{DynamicResource ToggleButtonSuccess}" />
</StackPanel>
ViewModel:
public partial class MainViewModel:ObservableObject
{
[ObservableProperty]
private string pwd = string.Empty;
[ObservableProperty]
private Visibility pwdVis = Visibility.Visible;
[ObservableProperty]
private Visibility txtVis = Visibility.Hidden;
[RelayCommand]
public void TBtnCmd(bool isChecked)
{
if (isChecked)
{
TxtVis = Visibility.Visible;
PwdVis = Visibility.Hidden;
}
else
{
TxtVis = Visibility.Hidden;
PwdVis = Visibility.Visible;
}
}
}