old mode 100755
new mode 100644
| | |
| | | using System;
|
| | | using System.Collections.Generic;
|
| | | using System.Text;
|
| | |
|
| | | namespace Shared.Phone.UserCenter
|
| | | {
|
| | | /// <summary>
|
| | | /// 验证码控件
|
| | | /// </summary>
|
| | | public class VerificationCodeControl : NormalFrameLayout
|
| | | {
|
| | | #region ■ 变量声明___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 每一个输入框值改变事件
|
| | | /// </summary>
|
| | | public Action<TextInputControl, string> TxtCodeChangeEvent = null;
|
| | | /// <summary>
|
| | | /// 结束输入的事件
|
| | | /// </summary>
|
| | | public Action<string> FinishInputEvent = null;
|
| | | /// <summary>
|
| | | /// 密码输入类型(它与NumberInputOnly不共存)
|
| | | /// </summary>
|
| | | public bool SecureTextEntry = false;
|
| | | /// <summary>
|
| | | /// 输入键盘指定为数字键盘(默认为true,它与SecureTextEntry不共存)
|
| | | /// </summary>
|
| | | public bool NumberInputOnly = true;
|
| | | /// <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 = (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 ■ 验证码事件_________________________
|
| | |
|
| | | /// <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)
|
| | | {
|
| | | //自动焦点选择前面的空白位置
|
| | | //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;
|
| | | }
|
| | | }
|
| | |
|
| | | /// <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;
|
| | | #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);
|
| | | }
|
| | | }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 键盘事件
|
| | | /// </summary>
|
| | | /// <param name="keysCode"></param>
|
| | | 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 ■ 一般方法___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 设置焦点
|
| | | /// </summary>
|
| | | public void SetFocus()
|
| | | {
|
| | | if (dicCodeControls.Count > 0)
|
| | | {
|
| | | dicCodeControls[0].Foucs = true;
|
| | | }
|
| | | }
|
| | |
|
| | | /// <summary>
|
| | | /// 清空输入的值
|
| | | /// </summary>
|
| | | 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 ■ 控件摧毁___________________________
|
| | |
|
| | | /// <summary>
|
| | | /// 控件摧毁
|
| | | /// </summary>
|
| | | public override void RemoveAll()
|
| | | {
|
| | | this.dicCodeControls.Clear();
|
| | | this.TxtCodeChangeEvent = null;
|
| | | this.FinishInputEvent = null;
|
| | |
|
| | | base.RemoveAll();
|
| | | }
|
| | |
|
| | | #endregion
|
| | | }
|
| | | }
|
| | | using System; |
| | | using System.Collections.Generic; |
| | | using System.Text; |
| | | |
| | | namespace Shared.Phone.UserCenter |
| | | { |
| | | /// <summary> |
| | | /// 验证码控件 |
| | | /// </summary> |
| | | public class VerificationCodeControl : NormalFrameLayout |
| | | { |
| | | #region ■ 变量声明___________________________ |
| | | |
| | | /// <summary> |
| | | /// 每一个输入框值改变事件 |
| | | /// </summary> |
| | | public Action<TextInputControl, string> TxtCodeChangeEvent = null; |
| | | /// <summary> |
| | | /// 结束输入的事件 |
| | | /// </summary> |
| | | public Action<string> FinishInputEvent = null; |
| | | /// <summary> |
| | | /// 密码输入类型(它与NumberInputOnly不共存) |
| | | /// </summary> |
| | | public bool SecureTextEntry = false; |
| | | /// <summary> |
| | | /// 输入键盘指定为数字键盘(默认为true,它与SecureTextEntry不共存) |
| | | /// </summary> |
| | | public bool NumberInputOnly = true; |
| | | /// <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 = (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 ■ 验证码事件_________________________ |
| | | |
| | | /// <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) |
| | | { |
| | | //自动焦点选择前面的空白位置 |
| | | //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; |
| | | } |
| | | } |
| | | |
| | | /// <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; |
| | | #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); |
| | | } |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 键盘事件 |
| | | /// </summary> |
| | | /// <param name="keysCode"></param> |
| | | 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 ■ 一般方法___________________________ |
| | | |
| | | /// <summary> |
| | | /// 设置焦点 |
| | | /// </summary> |
| | | public void SetFocus() |
| | | { |
| | | if (dicCodeControls.Count > 0) |
| | | { |
| | | dicCodeControls[0].Foucs = true; |
| | | } |
| | | } |
| | | |
| | | /// <summary> |
| | | /// 清空输入的值 |
| | | /// </summary> |
| | | 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 ■ 控件摧毁___________________________ |
| | | |
| | | /// <summary> |
| | | /// 控件摧毁 |
| | | /// </summary> |
| | | public override void RemoveAll() |
| | | { |
| | | this.dicCodeControls.Clear(); |
| | | this.TxtCodeChangeEvent = null; |
| | | this.FinishInputEvent = null; |
| | | |
| | | base.RemoveAll(); |
| | | } |
| | | |
| | | #endregion |
| | | } |
| | | } |