<UserControl x:Class="项目.UcPassword"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:YouMin_MicroplateReader"
xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
xmlns:keyboard="clr-namespace:Hs.KeyBoard.WPF.Behavior;assembly=Hs.KeyBoard.WPF" >
<UserControl.Resources>
<Style TargetType="CheckBox" x:Key="CheckBoxStyle">
<Setter Property="HorizontalAlignment" Value="Right"></Setter>
<Setter Property="VerticalAlignment" Value="Center"></Setter>
<Setter Property="Margin" Value="0 0 5 0"></Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="CheckBox">
<Image Margin="0 0 5 0" Height="30" Width="30" Stretch="Fill" x:Name="Img"
Source="pack://application:,,,/项目名称;component/Images/GrayWhite.png"/>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="CheckBox" x:Key="LookStyle">
<Setter Property="HorizontalAlignment" Value="Right"></Setter>
<Setter Property="VerticalAlignment" Value="Center"></Setter>
<Setter Property="Margin" Value="0 0 5 0"></Setter>
<Setter Property="Cursor" Value="Hand" />
<Setter Property="IsChecked" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type CheckBox}">
<Image Margin="0 0 5 0" Height="50" Width="55" Stretch="Fill" x:Name="Img"/>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Opacity" Value="0.6"/>
</Trigger>
<Trigger Property="IsChecked" Value="True">
<Setter TargetName="Img" Property="Source" Value="pack://application:,,,/项目名称;component/Images/Look.png" />
</Trigger>
<Trigger Property="IsChecked" Value="False">
<Setter TargetName="Img" Property="Source" Value="pack://application:,,,/项目名称;component/Images/UnLook.png" />
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</UserControl.Resources>
<Border Background="#F3FAFF" BorderBrush="#FFFFFF" BorderThickness="3" Height="56" Width="500" >
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition />
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBox Background="Transparent" BorderThickness="0" VerticalContentAlignment="Center" Padding="5,0,0,0"
Visibility="{Binding TbVisibility,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}"
Text="{Binding Password,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Behaviors>
<keyboard:KeyboardBehavior />
</i:Interaction.Behaviors>
</TextBox>
<PasswordBox Background="Transparent" BorderThickness="0" local:PasswordBoxHelper.Attach="True" Padding="5,0,0,0" VerticalContentAlignment="Center"
Visibility="{Binding PwVisibility,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}"
local:PasswordBoxHelper.Password="{Binding Password,RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}},Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
InputMethod.IsInputMethodEnabled="False">
<i:Interaction.Behaviors>
<keyboard:KeyboardBehavior />
</i:Interaction.Behaviors>
</PasswordBox>
<CheckBox Grid.Column="1" Style="{StaticResource CheckBoxStyle}" Panel.ZIndex="999"
IsChecked="{Binding IsCleared,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}"
Visibility ="{Binding ClearVisibility,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}"/>
<CheckBox Grid.Column="2" Style="{StaticResource LookStyle}" Panel.ZIndex="999"
IsChecked="{Binding IsChecked,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type UserControl}},Mode=TwoWay}">
</CheckBox>
</Grid>
</Border>
</UserControl>
PasswordBoxHelper.cs
using System;
using System.Windows;
using System.Windows.Controls;
namespace 项目名称
{
public static class PasswordBoxHelper
{
public static readonly DependencyProperty PasswordProperty = DependencyProperty.RegisterAttached("Password", typeof(string), typeof(PasswordBoxHelper), new FrameworkPropertyMetadata(string.Empty, OnPasswordPropertyChanged));
public static readonly DependencyProperty AttachProperty = DependencyProperty.RegisterAttached("Attach", typeof(bool), typeof(PasswordBoxHelper), new PropertyMetadata(false, Attach));
private static readonly DependencyProperty IsUpdatingProperty = DependencyProperty.RegisterAttached("IsUpdating", typeof(bool), typeof(PasswordBoxHelper));
public static void SetAttach(DependencyObject dp, bool value)
{
dp.SetValue(AttachProperty, value);
}
public static bool GetAttach(DependencyObject dp)
{
return (bool)dp.GetValue(AttachProperty);
}
public static string GetPassword(DependencyObject dp)
{
return (string)dp.GetValue(PasswordProperty);
}
public static void SetPassword(DependencyObject dp, string value)
{
dp.SetValue(PasswordProperty, value);
}
private static bool GetIsUpdating(DependencyObject dp)
{
return (bool)dp.GetValue(IsUpdatingProperty);
}
private static void SetIsUpdating(DependencyObject dp, bool value)
{
dp.SetValue(IsUpdatingProperty, value);
}
private static void OnPasswordPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (sender is not PasswordBox passwordBox || passwordBox == null) { return; }
try
{
passwordBox.PasswordChanged -= PasswordChanged;
if (!(bool)GetIsUpdating(passwordBox))
{
passwordBox.Password = (string)e.NewValue;
}
passwordBox.PasswordChanged += PasswordChanged;
}
catch (Exception ex)
{
LogHelper.GetSingleObj().WriteLog(ex);
}
}
private static void Attach(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (sender is not PasswordBox passwordBox || passwordBox == null) { return; }
try
{
if ((bool)e.OldValue)
{
passwordBox.PasswordChanged -= PasswordChanged;
}
if ((bool)e.NewValue)
{
passwordBox.PasswordChanged += PasswordChanged;
}
}
catch (Exception ex)
{
LogHelper.GetSingleObj().WriteLog(ex);
}
}
private static void PasswordChanged(object sender, RoutedEventArgs e)
{
if (sender is not PasswordBox passwordBox || passwordBox == null) { return; }
try
{
SetIsUpdating(passwordBox, true);
SetPassword(passwordBox, passwordBox.Password);
SetIsUpdating(passwordBox, false);
}
catch (Exception ex)
{
LogHelper.GetSingleObj().WriteLog(ex);
}
}
}
}
调用
cs
xmlns:local="clr-namespace:项目名"
<local:UcPassword Password="{Binding Password,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" Grid.Row="2" Grid.Column="1" Panel.ZIndex="1" HorizontalAlignment="Left" Width="500" Height="56" />
ViewModel
cs
/// <summary>
/// 密码
/// </summary>
[ObservableProperty]
string _Password = string.Empty;