xm
2020-12-14 d6fb0646531172f23648441c224cdcccd721b894
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/NormalControls/DateSelectControl.cs
New file
@@ -0,0 +1,196 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 日期选择控件(设置和获取值,请使用 dateValue)
    /// </summary>
    public class DateSelectControl : ButtonBase
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 日期选择时间(8位,如:20101231)
        /// </summary>
        public Action<string> DateSelectEvent = null;
        /// <summary>
        /// 日期格式
        /// </summary>
        private string dateFomat = string.Empty;
        /// <summary>
        /// 标题信息
        /// </summary>
        private string titleText = string.Empty;
        private string m_dateValue = "00000000";
        /// <summary>
        /// 设置或者获取日期值(8位,如:20101231)
        /// </summary>
        public string dateValue
        {
            get { return m_dateValue; }
            set
            {
                this.m_dateValue = value;
                int year = Convert.ToInt32(value.Substring(0, 4));
                int month = Convert.ToInt32(value.Substring(4, 2));
                int day = Convert.ToInt32(value.Substring(6, 2));
                var myTime = new DateTime(year, month, day);
                this.Text = myTime.ToString(this.dateFomat);
            }
        }
        /// <summary>
        /// 年
        /// </summary>
        public int Year
        {
            get { return Convert.ToInt32(m_dateValue.Substring(0, 4)); }
        }
        /// <summary>
        /// 月
        /// </summary>
        public int Month
        {
            get { return Convert.ToInt32(m_dateValue.Substring(4, 2)); }
        }
        /// <summary>
        /// 日
        /// </summary>
        public int Day
        {
            get { return Convert.ToInt32(m_dateValue.Substring(6, 2)); }
        }
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 日期选择控件(设置和获取值,请使用 dateValue)
        /// </summary>
        /// <param name="i_titleText">标题文本</param>
        /// <param name="i_dateFomat">日期格式</param>
        public DateSelectControl(string i_titleText = "", string i_dateFomat = "yyyy/MM/dd")
        {
            this.dateFomat = i_dateFomat;
            this.titleText = i_titleText;
            //用来计算长度的
            string dateTextTemp = DateTime.Now.ToString(i_dateFomat);
            this.TextSize = 12;
            this.Text = dateTextTemp;
            this.InitSize(this.GetRealWidthByText(), Application.GetRealHeight(50), false);
            this.Text = string.Empty;
            //弹起日期选择
            this.ButtonClickEvent += (sender, e) =>
            {
                //日期选择
                this.DoSelectDate();
            };
        }
        #endregion
        #region ■ 日期选择___________________________
        /// <summary>
        /// 日期选择
        /// </summary>
        private void DoSelectDate()
        {
            var listYear = new List<string>();
            int nowYear = Convert.ToInt32(DateTime.Now.ToString("yyyy"));
            for (int i = 0; i < 6; i++)
            {
                //五年时间
                listYear.Insert(0, (nowYear - i).ToString());
            }
            //月
            var listMonth = new List<string>();
            var monthText = Language.StringByID(R.MyInternationalizationString.Month);
            for (int i = 1; i <= 12; i++)
            {
                listMonth.Add(i.ToString().PadLeft(2, '0') + monthText);
            }
            //日
            var listDay = new List<string>();
            var dayText = Language.StringByID(R.MyInternationalizationString.Day);
            for (int i = 1; i <= 31; i++)
            {
                listDay.Add(i.ToString().PadLeft(2, '0') + dayText);
            }
            PickerView.ShowNormal(listYear, listMonth, listDay, (iyear, imonth, iday) =>
            {
                //获取正确的日期文本
                string datetTemp = this.GetRightDateText(Convert.ToInt32(listYear[iyear]), Convert.ToInt32(listMonth[imonth].Substring(0, 2)), Convert.ToInt32(listDay[iday].Substring(0, 2)));
                bool change = datetTemp != this.dateValue;
                //文本显示
                this.dateValue = datetTemp;
                if (change == true)
                {
                    //值改变才会调用回调函数
                    DateSelectEvent?.Invoke(datetTemp);
                }
            },
            listYear.IndexOf(m_dateValue.Substring(0, 4)),
            listMonth.IndexOf(m_dateValue.Substring(4, 2) + monthText),
            listDay.IndexOf(m_dateValue.Substring(6, 2) + dayText),
            this.titleText,
            Language.StringByID(R.MyInternationalizationString.uFinish),
            Language.StringByID(R.MyInternationalizationString.uCancel));
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 获取正确的日期文本
        /// </summary>
        /// <param name="year"></param>
        /// <param name="month"></param>
        /// <param name="day"></param>
        /// <returns></returns>
        private string GetRightDateText(int year, int month, int day)
        {
            if (month == 4 || month == 6 || month == 9 || month == 11)
            {
                if (day > 30)
                {
                    day = 30;
                }
            }
            else if (month == 2)
            {
                //闰年
                if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
                {
                    if (day > 29)
                    {
                        day = 29;
                    }
                }
                else
                {
                    if (day > 28)
                    {
                        day = 28;
                    }
                }
            }
            return year.ToString() + month.ToString().PadLeft(2, '0') + day.ToString().PadLeft(2, '0');
        }
        #endregion
    }
}