using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
namespace Communal.Extension
{
/// <summary>
/// Password 附加属性
/// </summary>
public class PasswordHelper
{
public static bool GetIsBindExtensionPassword(DependencyObject d)
{
return (bool)d.GetValue(IsBindExtensionPasswordProperty);
}
public static void SetIsBindExtensionPassword(DependencyObject d, bool value)
{
d.SetValue(IsBindExtensionPasswordProperty, value);
}
/// <summary>
/// 附加属性:是否使用扩展密码
/// </summary>
public static readonly DependencyProperty IsBindExtensionPasswordProperty =
DependencyProperty.RegisterAttached("IsBindExtensionPassword", typeof(bool), typeof(PasswordHelper), new PropertyMetadata(false, OnIsBindExtensionPasswordPropertyChanged));
private static void OnIsBindExtensionPasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PasswordBox pb = d as PasswordBox;
if (pb == null)
return;
if ((bool)e.NewValue)
pb.PasswordChanged += Pb_PasswordChanged;
if ((bool)e.OldValue)
pb.PasswordChanged -= Pb_PasswordChanged;
}
/// <summary>
/// 附加属性:扩展密码,用于MVVM绑定
/// </summary>
public static readonly DependencyProperty ExtensionPasswordProperty = DependencyProperty.RegisterAttached("ExtensionPassword", typeof(string), typeof(PasswordHelper),
new PropertyMetadata(new PropertyChangedCallback(OnExtensionPasswordPropertyChanged)));
public static string GetExtensionPassword(DependencyObject d)
{
return (string)d.GetValue(ExtensionPasswordProperty);
}
public static void SetExtensionPassword(DependencyObject d, string value)
{
d.SetValue(ExtensionPasswordProperty, value);
}
private static void OnExtensionPasswordPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
PasswordBox passwordBox = d as PasswordBox;
if (passwordBox == null)
return;
passwordBox.Password = e.NewValue.ToString();
SetSelection(passwordBox, passwordBox.Password.Length, 0);
}
private static void SetSelection(PasswordBox passwordBox, int start, int length)
{
passwordBox.GetType()
.GetMethod("Select", BindingFlags.Instance | BindingFlags.NonPublic)
.Invoke(passwordBox, new object[] { start, length });
}
private static void Pb_PasswordChanged(object sender, RoutedEventArgs e)
{
var passwordBox = (PasswordBox)sender;
if (passwordBox == null)
return;
SetExtensionPassword(passwordBox, passwordBox.Password);
}
}
}