HDL Home App 第二版本 旧平台金堂用 正在使用
hxb
2022-08-30 25429f085093d89d543a0b90e30d0d62d1b7dac9
ZigbeeApp/Shared/Phone/CommonForm/CommonFormBase.cs
New file
@@ -0,0 +1,454 @@
using Shared.Phone.UserCenter;
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace Shared.Phone
{
    /// <summary>
    /// 界面最基层的底层共通
    /// </summary>
    public class CommonFormBase : FrameLayout
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 画面的ID(自动编号,唯一主键,和各页面并无任何逻辑关系,但是它的用处大着呢)
        /// </summary>
        public string FormID = string.Empty;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 初始化界面框架
        /// </summary>
        public virtual void InitForm()
        {
            //将当前的画面保存到内存当中
            UserCenterLogic.AddActionForm(this);
            //Log出力
            HdlLogLogic.Current.WriteLog(1, this.FormID + " 界面打开");
        }
        /// <summary>
        /// 执行ShowForm()方法
        /// </summary>
        /// <param name="parameter">启动参数</param>
        public virtual void LoadShowFormMethod(params object[] parameter)
        {
            this.LoadFormMethodByName(this, "ShowForm", parameter);
        }
        #endregion
        #region ■ 添加界面___________________________
        /// <summary>
        /// 添加画面,启动参数由指定画面的ShowForm函数所指定
        /// </summary>
        /// <param name="parameter">启动参数:参数由指定画面的ShowForm函数所指定</param>
        public virtual void AddForm(params object[] parameter)
        {
            //关闭输入法界面
            this.CloseInputPanel();
            return;
        }
        /// <summary>
        /// 添加指定画面,并移除当前画面,启动参数由指定画面的ShowForm函数所指定
        /// </summary>
        /// <param name="form">目标界面</param>
        /// <param name="parameter">启动参数:参数由指定画面的ShowForm函数所指定</param>
        public void AddFromAndRemoveNowForm(CommonFormBase form, params object[] parameter)
        {
            //移除当前画面
            this.CloseForm();
            //添加画面
            form.AddForm(parameter);
        }
        #endregion
        #region ■ 关闭界面___________________________
        /// <summary>
        /// 画面关闭之前(底层变更,不能重载CloseForm方法了)
        /// </summary>
        public virtual void CloseFormBefore()
        {
            //关闭输入法界面
            this.CloseInputPanel();
        }
        /// <summary>
        /// 画面关闭之后(新增)
        /// </summary>
        public virtual void CloseFormAfter()
        {
        }
        /// <summary>
        /// 画面关闭
        /// </summary>
        public void CloseForm()
        {
            //Log出力
            HdlLogLogic.Current.WriteLog(1, this.FormID + " 界面关闭");
            try
            {
                //关闭进度条
                this.CloseProgressBar();
                //画面关闭之前
                this.CloseFormBefore();
                //调用的是Base的移除控件函数
                //而不是调用this的移除控件函
                base.RemoveFromParent();
                //从列表中移除(防止画面二重添加)
                UserCenterLogic.RemoveActionForm(this);
                //画面关闭之后
                this.CloseFormAfter();
            }
            catch (Exception ex)
            {
                //出现未知错误
                this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.uUnKnownError));
                //Log出力
                HdlLogLogic.Current.WriteLog(ex);
            }
        }
        /// <summary>
        /// 画面关闭(在画面里面,请不要调用此方法,请使用CloseForm()方法)
        /// </summary>
        public override void RemoveFromParent()
        {
            //画面右滑时,关闭画面,调用自定义的CloseForm()方法
            this.CloseForm();
        }
        #endregion
        #region ■ 网关在线状态推送___________________
        /// <summary>
        /// 网关在线状态变更推送(只有在变更的时候才会推送)
        /// </summary>
        /// <param name="gateWay">网关对象</param>
        /// <param name="online">在线状态变更后的状态</param>
        /// <param name="hadGwOnline">2020.05.25追加:此住宅是否拥有网关在线</param>
        public virtual void GatewayOnlinePush(ZigBee.Device.ZbGateway gateWay, bool online, bool hadGwOnline)
        {
        }
        #endregion
        #region ■ 圆形进度条_________________________
        /// <summary>
        /// 进度条启动
        /// </summary>
        /// <param name="text">初始文本</param>
        public void ShowProgressBar(string text = "")
        {
            if (this.FormID != UserCenterResourse.NowActionFormID)
            {
                return;
            }
            ProgressBar.Show(text);
        }
        /// <summary>
        /// 设置进度条的信息值(会自动计算百分比,值累加模式)
        /// </summary>
        /// <param name="value">值</param>
        public void SetProgressValue(decimal value)
        {
            ProgressBar.SetValue(value);
        }
        /// <summary>
        /// 设置进度条的信息值
        /// </summary>
        /// <param name="value">值</param>
        public void SetProgressValue(string value)
        {
            ProgressBar.SetValue(value);
        }
        /// <summary>
        /// 设置进度条的信息值
        /// </summary>
        /// <param name="value">值</param>
        public void SetProgressMax(decimal value)
        {
            if (value == 0)
            {
                value = 100;
            }
            ProgressBar.SetMaxValue(value);
        }
        /// <summary>
        /// 关闭进度条
        /// </summary>
        /// <param name="mode">是否显示重新加载的界面</param>
        public void CloseProgressBar(ShowReLoadMode mode = ShowReLoadMode.NO)
        {
            ProgressBar.Close();
            if (mode == ShowReLoadMode.YES)
            {
                //显示重新加载的界面(主要是用在界面加载错误时,再次加载)
                this.ShowReLoadView();
            }
        }
        /// <summary>
        /// 显示重新加载的界面(主要是用在界面加载错误时,再次加载)
        /// </summary>
        public virtual void ShowReLoadView()
        {
        }
        #endregion
        #region ■ 一般的方法_________________________
        /// <summary>
        /// 显示信息框
        /// </summary>
        /// <param name="msgType">信息类型</param>
        /// <param name="msg">信息</param>
        /// <param name="action">单击确认后执行的回调函数</param>
        /// <param name="buttonText">按钮的文本</param>
        /// <param name="i_waitTime">等待时间,单位为秒,设置确认按钮在多长时间后才能够点击</param>
        public void ShowMassage(ShowMsgType msgType, string msg, Action action = null, string buttonText = null, int i_waitTime = -1)
        {
            HdlMessageLogic.Current.ShowMassage(msgType, msg, action, buttonText, i_waitTime);
        }
        /// <summary>
        /// 判断当前正在活动的界面是否是当前这个界面
        /// </summary>
        /// <returns></returns>
        public bool NowFormIsAction()
        {
            return UserCenterResourse.NowActionFormID == this.FormID;
        }
        /// <summary>
        /// 关闭输入法界面(未实现)
        /// </summary>
        public void CloseInputPanel()
        {
        }
        /// <summary>
        /// 计算图片的真实高宽度
        /// </summary>
        /// <param name="i_size"></param>
        /// <returns></returns>
        public int GetPictrueRealSize(int i_size)
        {
            return HdlControlLogic.Current.GetPictrueRealSize(i_size);
        }
        /// <summary>
        /// 计算真实宽度(可能以后会变动,所以声明出来有用处)
        /// </summary>
        /// <param name="i_size"></param>
        /// <returns></returns>
        public int GetRealWidth(int i_size)
        {
            return HdlControlLogic.Current.GetRealWidth(i_size);
        }
        /// <summary>
        /// 计算真实高度度(可能以后会变动,所以声明出来有用处)
        /// </summary>
        /// <param name="i_size"></param>
        /// <returns></returns>
        public int GetRealHeight(int i_size)
        {
            return HdlControlLogic.Current.GetRealHeight(i_size);
        }
        /// <summary>
        /// 计算真实大小(这个东西有特殊用处,考虑到加长型屏幕的控件,调用此方法)
        /// </summary>
        /// <param name="i_size"></param>
        /// <returns></returns>
        public int GetRealSizeEx(int i_size)
        {
            return HdlControlLogic.Current.GetRealSizeEx(i_size);
        }
        /// <summary>
        /// 判断指定的界面是否打开
        /// </summary>
        /// <param name="formId"></param>
        /// <returns></returns>
        public bool IsFormOpen(string formId)
        {
            return UserCenterResourse.DicActionForm.ContainsKey(formId);
        }
        #endregion
        #region ■ 检测错误___________________________
        /// <summary>
        /// 检测界面的错误
        /// </summary>
        /// <returns></returns>
        public virtual bool CheckForm()
        {
            //检测控件
            return this.CheckControl(this);
        }
        /// <summary>
        /// 检测控件
        /// </summary>
        /// <param name="view"></param>
        /// <returns></returns>
        private bool CheckControl(View view)
        {
            //第一个进来肯定是 ViewGroup
            if (view is ViewGroup)
            {
                var viewGroup = (ViewGroup)view;
                for (int i = 0; i < viewGroup.ChildrenCount; i++)
                {
                    var myView = viewGroup.GetChildren(i);
                    if (myView is ViewGroup)
                    {
                        //递归检测
                        bool result = this.CheckControl(myView);
                        if (result == false)
                        {
                            return false;
                        }
                        continue;
                    }
                    if (myView is TextInputControl)
                    {
                        //检测输入框的错误
                        var error = ((TextInputControl)myView).CheckError();
                        if (error != null)
                        {
                            this.ShowMassage(ShowMsgType.Tip, error);
                            ((TextInputControl)myView).OnError = true;
                            return false;
                        }
                        ((TextInputControl)myView).OnError = false;
                    }
                }
            }
            return true;
        }
        #endregion
        #region ■ 反射方法___________________________
        /// <summary>
        /// 关闭指定的画面
        /// </summary>
        /// <param name="formName">指定要关闭的画面英文名字</param>
        public void CloseFormByFormName(string formName)
        {
            if (UserCenterResourse.DicActionForm.ContainsKey(formName) == false)
            {
                return;
            }
            //关闭指定画面
            UserCenterResourse.DicActionForm[formName]?.CloseForm();
        }
        /// <summary>
        /// 执行指定画面的方法
        /// </summary>
        /// <param name="formName">指定画面的英文名</param>
        /// <param name="method">指定要加载的方法名</param>
        /// <param name="parameter">启动参数</param>
        public object LoadFormMethodByName(string formName, string method, params object[] parameter)
        {
            if (UserCenterResourse.DicActionForm.ContainsKey(formName) == false)
            {
                return null;
            }
            var form = UserCenterResourse.DicActionForm[formName];
            return this.LoadFormMethodByName(form, method, parameter);
        }
        /// <summary>
        /// 执行指定画面的方法(注意:这个是专门调用异步,并且等待异步完成的高科技函数,不调用异步的情况,别使用此函数)
        /// </summary>
        /// <param name="formName">指定画面的英文名</param>
        /// <param name="method">指定要加载的方法名</param>
        /// <param name="parameter">启动参数</param>
        public async Task<object> LoadFormMethodByNameAsync(string formName, string method, params object[] parameter)
        {
            if (UserCenterResourse.DicActionForm.ContainsKey(formName) == false)
            {
                return null;
            }
            var form = UserCenterResourse.DicActionForm[formName];
            var task = this.LoadFormMethodByName(form, method, parameter) as Task;
            await task;
            var result = task.GetType().GetProperty("Result").GetValue(task, null);
            return result;
        }
        /// <summary>
        /// 执行指定画面的方法
        /// </summary>
        /// <param name="form">指定画面的英文名</param>
        /// <param name="method">指定要加载的方法名</param>
        /// <param name="parameter">启动参数</param>
        public object LoadFormMethodByName(CommonFormBase form, string method, params object[] parameter)
        {
            try
            {
                if (form == null)
                {
                    return null;
                }
                var myMethod = form.GetType().GetMethod(method);
                return myMethod.Invoke(form, parameter);
            }
            catch (Exception ex)
            {
                //出现未知错误,数据丢失
                this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.uUnKnownError));
                //Log出力
                HdlLogLogic.Current.WriteLog(ex);
                return null;
            }
        }
        /// <summary>
        /// 使用反射方法,打开指定的画面(只支持继承于UserCenterCommonForm的画面)
        /// </summary>
        /// <param name="fullName">画面的命名空间+画面的英文名</param>
        /// <param name="parameter">启动参数</param>
        public void LoadFormByFullName(string fullName, params object[] parameter)
        {
            System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
            var form = (CommonFormBase)assembly.CreateInstance(fullName);
            form.AddForm(parameter);
        }
        #endregion
    }
}