HDL Home App 第二版本 旧平台金堂用 正在使用
黄学彪
2020-12-14 e90209beae6a4e822cecb18e6889f8bda23f630e
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/VerificationCodeControl.cs
old mode 100755 new mode 100644
@@ -1,288 +1,288 @@
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
    }
}