using System;
|
using System.Collections.Generic;
|
using System.Text;
|
|
namespace Shared.Phone.UserCenter
|
{
|
/// <summary>
|
/// 验证码控件
|
/// </summary>
|
public class VerificationCodeControl : FrameLayout
|
{
|
#region ■ 变量声明___________________________
|
|
/// <summary>
|
/// 每一个输入框值改变事件
|
/// </summary>
|
public Action<TextInputControl, string> TxtCodeChangeEvent = null;
|
/// <summary>
|
/// 结束输入的事件
|
/// </summary>
|
public Action<string> FinishInputEvent = null;
|
/// <summary>
|
/// 密码输入类型
|
/// </summary>
|
public bool SecureTextEntry = false;
|
/// <summary>
|
/// 验证码长度
|
/// </summary>
|
private int CodeLenth = 0;
|
/// <summary>
|
/// 验证码输入控件
|
/// </summary>
|
private Dictionary<int, TextInputControl> dicCodeControls = new Dictionary<int, TextInputControl>();
|
|
#endregion
|
|
#region ■ 初始化_____________________________
|
|
/// <summary>
|
/// 验证码控件
|
/// </summary>
|
/// <param name="i_CodeLenth">验证码长度</param>
|
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 ■ 验证码控件_________________________
|
|
/// <summary>
|
/// 初始化控件
|
/// </summary>
|
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 = 6;
|
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;
|
}
|
txtCode.Name = i.ToString();
|
txtCode.TextAlignment = TextAlignment.Center;
|
frameCode.AddChidren(txtCode);
|
|
dicCodeControls[i] = txtCode;
|
|
//光标事件
|
txtCode.FoucsChanged += this.TxtCode_FoucsChangedEvent;
|
//值改变事件
|
txtCode.TextChangeEventHandler += this.TxtCode_TextChangeEvent;
|
}
|
}
|
|
#endregion
|
|
#region ■ 验证码事件_________________________
|
|
/// <summary>
|
/// 验证码焦点变更事件
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="e"></param>
|
private void TxtCode_FoucsChangedEvent(object sender, FocusEventArgs e)
|
{
|
var txtCode = (TextInputControl)sender;
|
if (txtCode.Parent == null)
|
{
|
return;
|
}
|
if (e.Focus == true)
|
{
|
txtCode.Parent.BorderColor = UserCenterColor.Current.TextFrameSelectColor;
|
}
|
else
|
{
|
txtCode.Parent.BorderColor = UserCenterColor.Current.TextFrameColor;
|
}
|
}
|
|
/// <summary>
|
/// 验证码值改变事件
|
/// </summary>
|
/// <param name="sender"></param>
|
/// <param name="textValue"></param>
|
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;
|
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;
|
}
|
else
|
{
|
//最后一位输入完成,校验验证码
|
string code = string.Empty;
|
for (int i = 0; i < this.CodeLenth; i++)
|
{
|
code += dicCodeControls[i].Text;
|
}
|
this.FinishInputEvent?.Invoke(code);
|
}
|
}
|
}
|
|
#endregion
|
|
#region ■ 一般方法___________________________
|
|
/// <summary>
|
/// 设置焦点
|
/// </summary>
|
public void SetFocus()
|
{
|
if (dicCodeControls.Count > 0)
|
{
|
dicCodeControls[0].Foucs = true;
|
}
|
}
|
|
#endregion
|
|
#region ■ 控件摧毁___________________________
|
|
/// <summary>
|
/// 控件摧毁
|
/// </summary>
|
public override void RemoveAll()
|
{
|
this.dicCodeControls.Clear();
|
this.TxtCodeChangeEvent = null;
|
this.FinishInputEvent = null;
|
|
base.RemoveAll();
|
}
|
|
#endregion
|
}
|
}
|