using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.ComponentModel;
using FLY.Thick.Base.IService;
using Unity;
namespace FLY.Thick.Base.UI
{
///
/// Window_Password.xaml 的交互逻辑
///
public partial class WdPassword : FLY.ControlLibrary.WindowBigClose,INotifyPropertyChanged
{
PasswordAuthorize passwordAuthorize;
static PasswordKeep mPwKeep = new PasswordKeep();
public WdPassword()
{
InitializeComponent();
}
public void Init(PasswordAuthorize passwordAuthorize, int level)
{
this.passwordAuthorize = passwordAuthorize;
this.Level = level;
}
///
/// 密码级别
///
int Level = 0;
///
/// 输入密码,查询到的级别
///
public int PwLv { get; private set; }
///
///
///
///
///
public static bool Authorize(string uiName)
{
return Authorize(uiName, out int pwLv);
}
///
///
///
/// 界面
/// 当密码正确时,密码的级别
///
public static bool Authorize(string uiName, out int pwLv)
{
pwLv = 0;
//从容器获取
var container = Application.Current.Properties["container"] as IUnityContainer;
if (container == null)
return true;
var passwordAuthorize = container.Resolve();
int level = passwordAuthorize.GetLv(uiName);
if (level <= 0)
return true;
WdPassword w = new WdPassword();
w.Init(passwordAuthorize, level);
w.Owner = Application.Current.MainWindow;
bool ret = (bool)w.ShowDialog();
pwLv = w.PwLv;
return ret;
}
///
///
///
/// 要求的级别
/// 当密码正确时,密码的级别
///
public static bool Authorize(int level, out int pwLv)
{
pwLv = 0;
//从容器获取
var container = Application.Current.Properties["container"] as IUnityContainer;
if (container == null)
return true;
var passwordAuthorize = container.Resolve();
if (level <= 0)
return true;
WdPassword w = new WdPassword();
w.Init(passwordAuthorize, level);
w.Owner = Application.Current.MainWindow;
bool ret = (bool)w.ShowDialog();
pwLv = w.PwLv;
return ret;
}
private void button_apply_Click(object sender, RoutedEventArgs e)
{
if(string.IsNullOrEmpty(passwordbox.Password))
{
FLY.ControlLibrary.Window_WarningTip.Show("错误", "密码为空",
TimeSpan.FromSeconds(2));
return;
}
AUTHORIZE_RESULT r = passwordAuthorize.Authorize(passwordbox.Password, Level, out int pwLv);
PwLv = pwLv;
switch (r)
{
case AUTHORIZE_RESULT.OK:
{
mPwKeep.SetPSK(passwordbox.Password);
this.DialogResult = true;
this.Close();
return;
}
case AUTHORIZE_RESULT.ERR_LEVEL:
{
FLY.ControlLibrary.Window_WarningTip.Show("错误", $"权限不足 需要Lv{Level}以上密码",
TimeSpan.FromSeconds(2));
return;
}
case AUTHORIZE_RESULT.ERR_PW:
{
FLY.ControlLibrary.Window_WarningTip.Show("错误", "密码错误",
TimeSpan.FromSeconds(2));
return;
}
}
return;
}
private void ButtonOSK_Click(object sender, RoutedEventArgs e)
{
TextBox tbPw = new TextBox
{
Text = passwordbox.Password,
Tag = "full password"
};
tbPw.TextChanged += (s, _e) =>
{
var textbox = s as TextBox;
passwordbox.Password = textbox.Text;
};
FLY.ControlLibrary.UI.OSK.KeyboardBehavior.PopPad(tbPw, this);
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
//从容器获取
//this.DataContext = this;
togglebutton_keep5min.DataContext = mPwKeep;
if (mPwKeep.GetPSK(out string psk))
{
passwordbox.Password = psk;
}
}
#region INotifyPropertyChanged 成员
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
///
/// 上一次的密码保持5分钟
///
public class PasswordKeep:INotifyPropertyChanged
{
///
/// 密码保存5分钟
///
public bool Keep5Min { get; set; } = true;
string PSK;
///
/// 密码输入时间
///
DateTime Time = DateTime.MinValue;
///
/// 复位
///
public void Reset()
{
Time = DateTime.MinValue;
}
public bool GetPSK(out string psk)
{
psk = null;
if (Keep5Min == false)
return false;
if ((DateTime.Now - Time) > TimeSpan.FromMinutes(5)) //5分钟内
return false;
psk = PSK;
return true;
}
public void SetPSK(string psk)
{
PSK = psk;
Time = DateTime.Now;
}
#region INotifyPropertyChanged 成员
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}