using System;
using System.Collections.Generic;
using System.Text;
namespace Shared.Phone
{
///
/// 验证码控件
///
public class VerificationCodeControl : NormalFrameLayout
{
#region ■ 变量声明___________________________
///
/// 每一个输入框值改变事件
///
public Action TxtCodeChangeEvent = null;
///
/// 结束输入的事件
///
public Action FinishInputEvent = null;
///
/// 密码输入类型(它与NumberInputOnly不共存)
///
public bool SecureTextEntry = false;
///
/// 输入键盘指定为数字键盘(默认为true,它与SecureTextEntry不共存)
///
public bool NumberInputOnly = true;
///
/// 验证码长度
///
private int CodeLenth = 0;
///
/// 验证码输入控件
///
private Dictionary dicCodeControls = new Dictionary();
#endregion
#region ■ 初始化_____________________________
///
/// 验证码控件
///
/// 验证码长度
public VerificationCodeControl(int i_CodeLenth)
{
this.CodeLenth = i_CodeLenth;
this.Height = Application.GetRealHeight(104);
this.Width = Application.GetRealWidth(i_CodeLenth * 115 + (i_CodeLenth - 1) * 49);
this.Gravity = Gravity.CenterHorizontal;
}
#endregion
#region ■ 验证码控件_________________________
///
/// 初始化控件
///
public void InitControl()
{
for (int i = 0; i < this.CodeLenth; i++)
{
var frameCode = new FrameLayout();
frameCode.X = i * Application.GetRealWidth(115 + 49);
frameCode.Width = Application.GetRealWidth(115);
frameCode.Height = Application.GetRealHeight(104);
frameCode.Radius = (uint)Application.GetRealHeight(17);
frameCode.BorderWidth = 1;
frameCode.BorderColor = UserCenterColor.Current.TextFrameColor;
this.AddChidren(frameCode);
var txtCode = new TextInputControl(frameCode.Width, frameCode.Height, false);
if (SecureTextEntry == true)
{
txtCode.SecureTextEntry = true;
}
else if (NumberInputOnly == true)
{
txtCode.IsNumberKeyboardType = true;
}
txtCode.Name = i.ToString();
txtCode.TextAlignment = TextAlignment.Center;
frameCode.AddChidren(txtCode);
dicCodeControls[i] = txtCode;
//光标事件
txtCode.FoucsChanged += this.TxtCode_FoucsChangedEvent;
//值改变事件
txtCode.TextChangeEventHandler += this.TxtCode_TextChangeEvent;
//键盘事件
txtCode.KeyEventAction += this.TxtCode_KeyEvent;
}
}
#endregion
#region ■ 验证码事件_________________________
///
/// 验证码焦点变更事件
///
///
///
private void TxtCode_FoucsChangedEvent(object sender, FocusEventArgs e)
{
var txtCode = (TextInputControl)sender;
if (txtCode.Parent == null)
{
return;
}
if (e.Focus == true)
{
//自动焦点选择前面的空白位置
//if (txtCode.Text == string.Empty)
//{
// for (int i = 0; i < this.CodeLenth; i++)
// {
// if (dicCodeControls[i].Text == string.Empty)
// {
// dicCodeControls[i].FoucsChanged -= this.TxtCode_FoucsChangedEvent;
// dicCodeControls[i].Parent.BorderColor = UserCenterColor.Current.TextFrameSelectColor;
// dicCodeControls[i].Foucs = true;
// dicCodeControls[i].FoucsChanged += this.TxtCode_FoucsChangedEvent;
// return;
// }
// }
//}
txtCode.Parent.BorderColor = UserCenterColor.Current.TextFrameSelectColor;
#if Android
txtCode.SetSelectionEnd();
#endif
}
else
{
txtCode.Parent.BorderColor = UserCenterColor.Current.TextFrameColor;
}
}
///
/// 验证码值改变事件
///
///
///
private void TxtCode_TextChangeEvent(object sender, string textValue)
{
this.TxtCodeChangeEvent?.Invoke((TextInputControl)sender, textValue);
if (textValue == string.Empty)
{
return;
}
//这个是自己复制粘贴过来的
if (textValue.Length == this.CodeLenth)
{
dicCodeControls[this.CodeLenth - 1].Foucs = true;
#if Android
//光标至于最后
dicCodeControls[this.CodeLenth - 1].SetSelectionEnd();
#endif
for (int i = 0; i < this.CodeLenth; i++)
{
//先移除事件
dicCodeControls[i].TextChangeEventHandler -= TxtCode_TextChangeEvent;
//赋值
dicCodeControls[i].Text = textValue[i].ToString();
dicCodeControls[i].TextChangeEventHandler += TxtCode_TextChangeEvent;
}
//校验验证码
this.FinishInputEvent?.Invoke(textValue);
}
else
{
//光标移动
var txtCode = (TextInputControl)sender;
//只能一个值
if (textValue.Length > 1)
{
//先移除事件
txtCode.TextChangeEventHandler -= TxtCode_TextChangeEvent;
txtCode.Text = txtCode.Text.Substring(0, 1);
txtCode.TextChangeEventHandler += TxtCode_TextChangeEvent;
}
int index = Convert.ToInt32(txtCode.Name);
if (dicCodeControls.ContainsKey(index + 1) == true)
{
dicCodeControls[index + 1].Foucs = true;
#if Android
//光标至于最后
dicCodeControls[index + 1].SetSelectionEnd();
#endif
}
else
{
#if Android
//光标至于最后
txtCode.SetSelectionEnd();
#endif
//最后一位输入完成,校验验证码
string code = string.Empty;
for (int i = 0; i < this.CodeLenth; i++)
{
code += dicCodeControls[i].Text;
}
this.FinishInputEvent?.Invoke(code);
}
}
}
///
/// 键盘事件
///
///
private void TxtCode_KeyEvent(object sender, string keysCode)
{
if (keysCode == "Del")
{
var txtCode = (TextInputControl)sender;
if (txtCode.Text == string.Empty)
{
int index = Convert.ToInt32(txtCode.Name);
if (dicCodeControls.ContainsKey(index - 1) == true)
{
dicCodeControls[index - 1].Foucs = true;
#if Android
//光标至于最后
dicCodeControls[index - 1].SetSelectionEnd();
#endif
}
}
}
}
#endregion
#region ■ 一般方法___________________________
///
/// 设置焦点
///
public void SetFocus()
{
if (dicCodeControls.Count > 0)
{
dicCodeControls[0].Foucs = true;
}
}
///
/// 清空输入的值
///
public void ClearInputValue()
{
foreach (var inputText in this.dicCodeControls.Values)
{
//先移除事件
inputText.TextChangeEventHandler -= TxtCode_TextChangeEvent;
//赋值
inputText.Text = string.Empty;
inputText.TextChangeEventHandler += TxtCode_TextChangeEvent;
}
dicCodeControls[0].Foucs = true;
}
#endregion
#region ■ 控件摧毁___________________________
///
/// 控件摧毁
///
public override void RemoveAll()
{
this.dicCodeControls.Clear();
this.TxtCodeChangeEvent = null;
this.FinishInputEvent = null;
base.RemoveAll();
}
#endregion
}
}