using System; using System.ComponentModel; using System.Security; using System.Windows; using System.Windows.Controls; using System.Windows.Input; using HandyControl.Data; using HandyControl.Interactivity; using HandyControl.Properties.Langs; namespace HandyControl.Controls { /// [TemplatePart(Name = ElementPasswordBox, Type = typeof(System.Windows.Controls.PasswordBox))] public class PasswordBox : Control, IDataInput { private const string ElementPasswordBox = "PART_PasswordBox"; /// /// 掩码字符 /// public static readonly DependencyProperty PasswordCharProperty = System.Windows.Controls.PasswordBox.PasswordCharProperty.AddOwner(typeof(PasswordBox), new FrameworkPropertyMetadata('●')); /// /// 数据是否错误 /// public static readonly DependencyProperty IsErrorProperty = DependencyProperty.Register( "IsError", typeof(bool), typeof(PasswordBox), new PropertyMetadata(ValueBoxes.FalseBox)); /// /// 错误提示 /// public static readonly DependencyProperty ErrorStrProperty = DependencyProperty.Register( "ErrorStr", typeof(string), typeof(PasswordBox), new PropertyMetadata(default(string))); /// /// 文本类型 /// public static readonly DependencyProperty TextTypeProperty = DependencyProperty.Register( "TextType", typeof(TextType), typeof(PasswordBox), new PropertyMetadata(default(TextType))); /// /// 是否显示清除按钮 /// public static readonly DependencyProperty ShowClearButtonProperty = DependencyProperty.Register( "ShowClearButton", typeof(bool), typeof(PasswordBox), new PropertyMetadata(ValueBoxes.FalseBox)); private string _password; private char _passwordChar; public PasswordBox() { CommandBindings.Add(new CommandBinding(ControlCommands.Clear, (s, e) => ActualPasswordBox.Clear())); } public System.Windows.Controls.PasswordBox ActualPasswordBox { get; set; } [DefaultValue("")] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public string Password { get => ActualPasswordBox?.Password; set { if (ActualPasswordBox == null) { _password = value; return; } ActualPasswordBox.Password = value; } } [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] public SecureString SecurePassword => ActualPasswordBox?.SecurePassword; public char PasswordChar { get => (char) GetValue(PasswordCharProperty); set => SetValue(PasswordCharProperty, value); } public Func> VerifyFunc { get; set; } public bool IsError { get => (bool) GetValue(IsErrorProperty); set => SetValue(IsErrorProperty, value); } public string ErrorStr { get => (string) GetValue(ErrorStrProperty); set => SetValue(ErrorStrProperty, value); } public TextType TextType { get => (TextType) GetValue(TextTypeProperty); set => SetValue(TextTypeProperty, value); } public bool ShowClearButton { get => (bool) GetValue(ShowClearButtonProperty); set => SetValue(ShowClearButtonProperty, value); } public virtual bool VerifyData() { OperationResult result; if (VerifyFunc != null) { result = VerifyFunc.Invoke(ActualPasswordBox.Password); } else { if (!string.IsNullOrEmpty(ActualPasswordBox.Password)) result = OperationResult.Success(); else if (InfoElement.GetNecessary(this)) result = OperationResult.Failed(Lang.IsNecessary); else result = OperationResult.Success(); } IsError = !result.Data; ErrorStr = result.Message; return result.Data; } public override void OnApplyTemplate() { if (ActualPasswordBox != null) ActualPasswordBox.PasswordChanged -= PasswordBox_PasswordChanged; base.OnApplyTemplate(); ActualPasswordBox = GetTemplateChild(ElementPasswordBox) as System.Windows.Controls.PasswordBox; if (ActualPasswordBox != null) { ActualPasswordBox.PasswordChanged += PasswordBox_PasswordChanged; if (!string.IsNullOrEmpty(_password)) { ActualPasswordBox.Password = _password; _password = null; } if (_passwordChar != default(char)) { ActualPasswordBox.PasswordChar = _passwordChar; _passwordChar = default(char); } } } public void Paste() => ActualPasswordBox.Paste(); public void SelectAll() => ActualPasswordBox.SelectAll(); public void Clear() => ActualPasswordBox.SelectAll(); private void PasswordBox_PasswordChanged(object sender, RoutedEventArgs e) { VerifyData(); } } }