xm
2020-12-14 d6fb0646531172f23648441c224cdcccd721b894
ZigbeeApp/Shared/Phone/UserCenter/Residence/EditorRoomInforForm.cs
old mode 100755 new mode 100644
@@ -3,682 +3,794 @@
using System.Text;
namespace Shared.Phone.UserCenter.Residence
{
{
  /// <summary>
  /// 编辑房间信息的界面
  /// </summary>
  public class EditorRoomInforForm : EditorCommonForm
  {
    #region ■ 变量声明___________________________
    /// <summary>
    /// 编辑房间信息的界面
    /// 结束编辑的事件
    /// </summary>
    public class EditorRoomInforForm : EditorCommonForm
    {
        #region ■ 变量声明___________________________
        /// <summary>
        /// 结束编辑的事件
        /// </summary>
        public Action<string> FinishEditorEvent = null;
        /// <summary>
        /// 列表控件
        /// </summary>
        private FrameListControl listview = null;
        /// <summary>
        /// 房间对象
        /// </summary>
        private Common.Room editorRoom = null;
        /// <summary>
        /// 克隆对象
        /// </summary>
        private Common.Room cloneRoom = null;
        /// <summary>
        /// 改变房间图片
        /// </summary>
        private bool changedRoomPic = false;
        #endregion
        #region ■ 初始化_____________________________
        /// <summary>
        /// 画面显示(底层会固定调用此方法,借以完成画面创建)
        /// </summary>
        /// <param name="i_editorRoom">编辑的房间对象</param>
        public void ShowForm(Common.Room i_editorRoom = null)
        {
            //弄一点初始值
            this.editorRoom = i_editorRoom;
            this.cloneRoom = HdlRoomLogic.Current.CloneRoomClass(i_editorRoom);
            if (i_editorRoom.HumidityDevice == string.Empty)
            {
                this.cloneRoom.Humidity = -1000;
            }
            if (i_editorRoom.TemperatrueDevice == string.Empty)
            {
                this.cloneRoom.Temperatrue = -1000;
            }
            //设置头部信息
            base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uEditorRoom));
            //初始化中部信息
            this.InitMiddleFrame();
        }
        /// <summary>
        /// 初始化中部信息
        /// </summary>
        private void InitMiddleFrame()
        {
            //清空bodyFrame
            this.ClearBodyFrame();
            var listBackControl = new VerticalFrameControl();
            listBackControl.Height = bodyFrameLayout.Height;
            bodyFrameLayout.AddChidren(listBackControl);
            //加一个白色背景
            var frameBack1 = new FrameLayout();
            frameBack1.Height = Application.GetRealHeight(450);
            frameBack1.Y = Application.GetRealHeight(196);
            frameBack1.BackgroundColor = UserCenterColor.Current.White;
            frameBack1.SetCornerWithSameRadius(Application.GetRealHeight(58), HDLUtils.RectCornerTopLeft | HDLUtils.RectCornerTopRight);
            listBackControl.frameTable.AddChidren(frameBack1);
            //初始化信息桌布
            var tableContr = new InformationEditorControl();
            this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uInfoEditor), 1175);
            //房间图片底部阴影
            var btnShadow = new PicViewControl(853, 593);
            btnShadow.Y = Application.GetRealHeight(58);
            btnShadow.Gravity = Gravity.CenterHorizontal;
            btnShadow.UnSelectedImagePath = "Room/RoomShadow.png";
            listBackControl.frameTable.AddChidren(btnShadow);
            //房间图片
            var btnPic = new ImageView();
            btnPic.Y = Application.GetRealHeight(60);
            btnPic.Width = this.GetPictrueRealSize(824);
            btnPic.Height = this.GetPictrueRealSize(549);
            btnPic.Radius = (uint)Application.GetRealHeight(17);
            btnPic.Gravity = Gravity.CenterHorizontal;
            if (this.editorRoom.BackgroundImageType == 0)
            {
                btnPic.ImagePath = this.editorRoom.BackgroundImage;
            }
            else
            {
                btnPic.ImageBytes = Common.Global.ReadFileByHomeId(this.editorRoom.BackgroundImage);
            }
            listBackControl.frameTable.AddChidren(btnPic);
            //图片遮罩
            var btnZhezhao = new FrameLayout();
            btnZhezhao.Width = btnPic.Width;
            btnZhezhao.Height = btnPic.Height;
            btnZhezhao.Y = btnPic.Y;
            btnZhezhao.Gravity = Gravity.CenterHorizontal;
            btnZhezhao.BackgroundColor = UserCenterColor.Current.PictrueZhezhaoColor;
            btnZhezhao.Radius = (uint)Application.GetRealHeight(17);
            listBackControl.frameTable.AddChidren(btnZhezhao);
            //分享的房间不能编辑
            if (this.editorRoom.IsSharedRoom == false)
            {
                btnZhezhao.MouseUpEventHandler += (sender, e) =>
                {
                    //房间图片选择
                    this.RoomPictrueSelect(btnPic);
                };
            }
            //变更一下那个白色背景的Y轴,它到图片的中间位置
            frameBack1.Y = btnPic.Y + btnPic.Height / 2;
            //添加全部菜单
            this.AddAllMenuRow(tableContr, btnPic);
        }
        #endregion
        #region ■ 添加菜单___________________________
        /// <summary>
        /// 添加全部菜单
        /// </summary>
        private void AddAllMenuRow(InformationEditorControl tableContr, ImageView btnPic)
        {
            //【房间名称】
            FrameCaptionInputControl txtRoomName = null;
            if (this.editorRoom.IsLove == false)
            {
                txtRoomName = new FrameCaptionInputControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2);
                txtRoomName.txtInput.PlaceholderText = Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName);
                listview.AddChidren(txtRoomName);
                txtRoomName.InitControl();
                //底线
                txtRoomName.AddBottomLine();
            }
            else
            {
                //我的喜爱不能编辑名字
                var rowRoomName = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2);
                listview.AddChidren(rowRoomName);
                rowRoomName.UseClickStatu = false;
                rowRoomName.InitControl();
                //底线
                rowRoomName.AddBottomLine();
            }
            //该APP为有楼层的模式才开启这个菜单
            if (this.editorRoom.IsLove == false && string.IsNullOrEmpty(this.cloneRoom.FloorId) == false)
            {
                //【所属楼层】
                var btnBelone = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uBelongeFloor), Common.Config.Instance.Home.FloorDics[this.cloneRoom.FloorId], this.listview.rowSpace / 2);
                listview.AddChidren(btnBelone);
                btnBelone.InitControl();
                //底线
                btnBelone.AddBottomLine();
                //分享的房间不能修改
                if (this.editorRoom.IsSharedRoom == false)
                {
                    //右箭头
                    btnBelone.AddRightArrow();
                    btnBelone.ButtonClickEvent += (sender, e) =>
                    {
                        //楼层选择
                        this.ShowSelectFloor(btnBelone);
                    };
                }
            }
            //【温度】
            var rowTemperature = new FrameRowControl(this.listview.rowSpace / 2);
            listview.AddChidren(rowTemperature);
            rowTemperature.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uTemperature), 600);
            //右箭头
            rowTemperature.AddRightArrow();
            var btnTemper = rowTemperature.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300);
            //底线
            rowTemperature.AddBottomLine();
            //分享的房间不能修改 或者当前住宅不是虚拟的
            if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false)
            {
                rowTemperature.ButtonClickEvent += (sender, e) =>
                {
                    //显示温度传感器列表
                    this.ShowTemperatrueDevice(btnTemper);
                };
            }
            if (string.IsNullOrEmpty(cloneRoom.TemperatrueDevice) == false)
            {
                //获取温度
                this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice);
            }
            //【湿度】
            var rowHumidity = new FrameRowControl(this.listview.rowSpace / 2);
            listview.AddChidren(rowHumidity);
            rowHumidity.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uHumidity), 600);
            //右箭头
            rowHumidity.AddRightArrow();
            var btnHumi = rowHumidity.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300);
            //底线
            rowHumidity.AddBottomLine();
            //分享的房间不能修改 或者当前住宅不是虚拟的
            if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false)
            {
                rowHumidity.ButtonClickEvent += (sender, e) =>
                {
                    //显示湿度传感器列表
                    this.ShowHumidityDevice(btnHumi);
                };
            }
            if (string.IsNullOrEmpty(cloneRoom.HumidityDevice) == false)
            {
                //获取湿度
                this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice);
            }
            //初始化桌布完成
            tableContr.FinishInitControl();
            tableContr = null;
            //分享的房间不能保存
            if (this.editorRoom.IsSharedRoom == true)
            {
                return;
            }
            //保存
            var btnFinish = new BottomClickButton();
            btnFinish.TextID = R.MyInternationalizationString.uSave;
            bodyFrameLayout.AddChidren(btnFinish);
            btnFinish.ButtonClickEvent += (sender, e) =>
            {
                if (txtRoomName != null)
                {
                    this.cloneRoom.Name = txtRoomName.Text;
                }
                //检测能否保存房间
                if (this.CheckCanSaveRoom() == false)
                {
                    return;
                }
                //更改图片
                if (this.changedRoomPic == true)
                {
                    if (editorRoom.BackgroundImageType == 1 || editorRoom.BackgroundImageType == 2)
                    {
                        //删除掉原来的自定义图片
                        if (Common.Global.IsExistsByHomeId(editorRoom.BackgroundImage) == true)
                        {
                            Common.Global.DeleteFilebyHomeId(editorRoom.BackgroundImage);
                        }
                        //备份
                        HdlAutoBackupLogic.DeleteFile(editorRoom.BackgroundImage);
                    }
                    //自定义图片
                    if (cloneRoom.BackgroundImageType == 1 || cloneRoom.BackgroundImageType == 2)
                    {
                        //生成图片
                        string picName = $"RoomIcon_{DateTime.Now.ToString("yyyyMMddHHmmss")}.png";
                        string picFullName = System.IO.Path.Combine(Common.Config.Instance.FullPath, picName);
                        Shared.IO.FileUtils.WriteFileByBytes(picFullName, btnPic.ImageBytes);
                        cloneRoom.BackgroundImage = picName;
                        //备份
                        HdlAutoBackupLogic.AddOrEditorFile(picName);
                    }
                }
                bool changedFloor = editorRoom.FloorId != cloneRoom.FloorId;
                editorRoom.FloorId = cloneRoom.FloorId;
                editorRoom.Name = cloneRoom.Name;
                editorRoom.HumidityDevice = cloneRoom.HumidityDevice;
                if (cloneRoom.Humidity != -1000)
                {
                    editorRoom.Humidity = cloneRoom.Humidity;
                }
                editorRoom.TemperatrueDevice = cloneRoom.TemperatrueDevice;
                if (cloneRoom.Temperatrue != -1000)
                {
                    editorRoom.Temperatrue = cloneRoom.Temperatrue;
                }
                editorRoom.BackgroundImage = cloneRoom.BackgroundImage;
                editorRoom.BackgroundImageType = cloneRoom.BackgroundImageType;
                editorRoom.Save();
                FinishEditorEvent?.Invoke(this.editorRoom.Name);
                if (changedFloor == false)
                {
                    //刷新左滑的房间列表界面的指定房间的信息
                    MainPage.ListRoomViewFrom.Instance.RefreshRoomInfo(this.editorRoom);
                }
                else
                {
                    //刷新左滑的房间列表界面的房间列表信息
                    MainPage.ListRoomViewFrom.Instance.RefreshListRoom();
                }
                //算了,这里如果按下保存,则主页需要重新刷新
                UserView.UserPage.Instance.RefreshForm = true;
                this.CloseForm();
            };
        }
        #endregion
        #region ■ 楼层选择___________________________
        /// <summary>
        /// 楼层选择
        /// </summary>
        /// <param name="control"></param>
        private void ShowSelectFloor(FrameCaptionViewControl control)
        {
            var dicFloor = HdlRoomLogic.Current.GetFloorSortList();
            var listKeys = new List<string>();
            var listName = new List<string>();
            int index = 0;
            foreach (string keys in dicFloor.Keys)
            {
                listKeys.Add(keys);
                listName.Add(dicFloor[keys]);
                if (keys == cloneRoom.FloorId)
                {
                    index = listKeys.Count - 1;
                }
            }
            PickerView.Show(listName, (value) =>
            {
                control.txtView.Text = listName[value];
                //主键修改
                cloneRoom.FloorId = listKeys[value];
            },
            index,
            Language.StringByID(R.MyInternationalizationString.uBelongeFloor),
            Language.StringByID(R.MyInternationalizationString.uFinish),
            Language.StringByID(R.MyInternationalizationString.uCancel));
        }
        #endregion
        #region ■ 温度传感器相关_____________________
        /// <summary>
        /// 显示温度传感器列表
        /// </summary>
        /// <param name="btnTemper"></param>
        private void ShowTemperatrueDevice(NormalViewControl btnTemper)
        {
            var listDevice = new List<ZigBee.Device.CommonDevice>();
            foreach (var device in Common.LocalDevice.Current.listAllDevice)
            {
                //获取温度传感器
                if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 1)
                {
                    listDevice.Add(device);
                }
            }
            var listSelect = new List<string>() { cloneRoom.TemperatrueDevice };
            var form = new SelectDeviceForm();
            form.AddForm(listDevice, listSelect, true, true);
            form.ActionSelectDevice += (list) =>
            {
                if (list.Count == 0)
                {
                    cloneRoom.TemperatrueDevice = string.Empty;
                    btnTemper.Text = Language.StringByID(R.MyInternationalizationString.uNothing);
                    return;
                }
                cloneRoom.TemperatrueDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]);
                //获取温度值
                this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice);
            };
        }
        /// <summary>
        /// 获取温度值
        /// </summary>
        /// <param name="btnHumi"></param>
        /// <param name="deviceKey"></param>
        private void GetTemperatrueValue(NormalViewControl btnTemper, string deviceKey)
        {
            var device = Common.LocalDevice.Current.GetDevice(deviceKey);
            if (device == null)
            {
                return;
            }
            if (cloneRoom.Temperatrue == -1000)
            {
                //没有获取得到过温度
                btnTemper.Text = Language.StringByID(R.MyInternationalizationString.Getting);
            }
            else
            {
                btnTemper.Text = this.cloneRoom.Temperatrue == 0 ? "0.0℃" : this.cloneRoom.Temperatrue.ToString() + "℃";
                btnTemper.Text += "  " + Language.StringByID(R.MyInternationalizationString.Getting);
            }
            HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice");
            HdlGatewayReceiveLogic.Current.AddAttributeEvent("TemperatrueDevice", ReceiveComandDiv.A设备属性上报, ((report) =>
            {
                string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
                if (cloneRoom.TemperatrueDevice != mainKeys || btnTemper == null)
                {
                    return;
                }
                foreach (var data in report.DeviceStatusReport.AttriBute)
                {
                    if (data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
                    {
                        HdlThreadLogic.Current.RunMain(() =>
                        {
                            if (data.AttriButeData == 0)
                            {
                                //0℃
                                btnTemper.Text = "0.0℃";
                                this.cloneRoom.Temperatrue = 0;
                            }
                            else if (data.AttriButeData > 32767)
                            {
                                //负数(特殊处理)
                                string strValue = (data.AttriButeData - 65536).ToString();
                                //小数点需要一位
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                //记录温度
                                this.cloneRoom.Temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                                btnTemper.Text = this.cloneRoom.Temperatrue.ToString() + "℃";
                            }
                            else
                            {
                                //小数点需要一位
                                string strValue = data.AttriButeData.ToString();
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                //记录温度
                                this.cloneRoom.Temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                                btnTemper.Text = this.cloneRoom.Temperatrue.ToString() + "℃";
                            }
                        });
                    }
                }
            }));
            //发送获取温度的命令
            ((ZigBee.Device.TemperatureSensor)device).ReadTemperatureOrHumidity();
        }
        #endregion
        #region ■ 湿度传感器相关_____________________
        /// <summary>
        /// 显示湿度传感器列表
        /// </summary>
        /// <param name="btnHumi"></param>
        private void ShowHumidityDevice(NormalViewControl btnHumi)
        {
            var listDevice = new List<ZigBee.Device.CommonDevice>();
            foreach (var device in Common.LocalDevice.Current.listAllDevice)
            {
                //获取湿度传感器
                if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 2)
                {
                    listDevice.Add(device);
                }
            }
            var listSelect = new List<string>() { cloneRoom.HumidityDevice };
            var form = new SelectDeviceForm();
            form.AddForm(listDevice, listSelect, true, true);
            form.ActionSelectDevice += (list) =>
            {
                if (list.Count == 0)
                {
                    cloneRoom.HumidityDevice = string.Empty;
                    btnHumi.Text = Language.StringByID(R.MyInternationalizationString.uNothing);
                    return;
                }
                cloneRoom.HumidityDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]);
                //获取湿度值
                this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice);
            };
        }
        /// <summary>
        /// 获取湿度值
        /// </summary>
        /// <param name="btnHumi"></param>
        /// <param name="deviceKey"></param>
        private void GetHumidityValue(NormalViewControl btnHumi, string deviceKey)
        {
            var device = Common.LocalDevice.Current.GetDevice(deviceKey);
            if (device == null)
            {
                return;
            }
            if (cloneRoom.Humidity == -1000)
            {
                //没有获取得到过湿度
                btnHumi.Text = Language.StringByID(R.MyInternationalizationString.Getting);
            }
            else
            {
                btnHumi.Text = this.cloneRoom.Humidity == 0 ? "0.0%" : this.cloneRoom.Humidity.ToString() + "%";
                btnHumi.Text += "  " + Language.StringByID(R.MyInternationalizationString.Getting);
            }
            HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice");
            HdlGatewayReceiveLogic.Current.AddAttributeEvent("HumidityDevice", ReceiveComandDiv.A设备属性上报, (report) =>
            {
                string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
                if (cloneRoom.HumidityDevice != mainKeys || btnHumi == null)
                {
                    return;
                }
                foreach (var data in report.DeviceStatusReport.AttriBute)
                {
                    if (data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
                    {
                        HdlThreadLogic.Current.RunMain(() =>
                        {
                            if (data.AttriButeData == 0)
                            {
                                //0
                                btnHumi.Text = "0.0%";
                                this.cloneRoom.Humidity = 0;
                            }
                            else
                            {
                                //小数点需要一位(湿度没有负数)
                                string strValue = data.AttriButeData.ToString();
                                strValue = strValue.Substring(0, strValue.Length - 1);
                                //记录湿度
                                this.cloneRoom.Humidity = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
                                btnHumi.Text = this.cloneRoom.Humidity.ToString() + "%";
                            }
                        });
                    }
                }
            });
            //发送获取湿度的命令
            ((ZigBee.Device.TemperatureSensor)device).ReadTemperatureOrHumidity();
        }
        #endregion
        #region ■ 房间图片选择_______________________
        /// <summary>
        /// 房间图片选择
        /// </summary>
        /// <param name="imageContr"></param>
        private void RoomPictrueSelect(ImageView imageContr)
        {
            var menuContr = new BottomMenuSelectForm();
            menuContr.AddForm(3);
            //默认图库
            menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.LocalPicture), () =>
            {
                var form = new SelectLocalRoomImageForm();
                form.AddForm();
                form.FinishSelectEvent = (imgPath) =>
                {
                    if (string.IsNullOrEmpty(imgPath) == true)
                    {
                        return;
                    }
                    this.changedRoomPic = true;
                    this.cloneRoom.BackgroundImageType = 0;
                    this.cloneRoom.BackgroundImage = imgPath;
                    imgPath = IO.FileUtils.GetImageFilePath(imgPath);
                    imageContr.ImageBytes = IO.FileUtils.ReadFile(imgPath);
                };
            });
            //拍照
            menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.Photograph), () =>
            {
                //通过相机拍照裁剪
                CropImage.TakePicture((imagePath) =>
                {
                    if (string.IsNullOrEmpty(imagePath) == true)
                    {
                        return;
                    }
                    this.changedRoomPic = true;
                    this.cloneRoom.BackgroundImageType = 1;
                    imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath);
                    System.IO.File.Delete(imagePath);
                }, "HdlPic", 2, 1);
            });
            //我的相册
            menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.MyAblums), () =>
            {
                //从相册选择图片裁剪
                CropImage.SelectPicture((imagePath) =>
                {
                    if (string.IsNullOrEmpty(imagePath) == true)
                    {
                        return;
                    }
                    this.changedRoomPic = true;
                    this.cloneRoom.BackgroundImageType = 2;
                    imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath);
                    System.IO.File.Delete(imagePath);
                }, "HdlPic", 2, 1);
            });
        }
        #endregion
        #region ■ 界面关闭___________________________
        /// <summary>
        /// 界面关闭
        /// </summary>
        public override void CloseFormBefore()
        {
            this.FinishEditorEvent = null;
            HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice");
            HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice");
            base.CloseFormBefore();
        }
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 检测能否保存房间
        /// </summary>
        /// <returns></returns>
        private bool CheckCanSaveRoom()
        {
            if (this.cloneRoom.Name == string.Empty)
            {
                //请输入房间名称
                this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName));
                return false;
            }
            if (string.IsNullOrEmpty(this.cloneRoom.FloorId) == true)
            {
                if (HdlRoomLogic.Current.GetAllListRooms().Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null)
                {
                    this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom));
                    return false;
                }
            }
            else
            {
                var listRoom = HdlRoomLogic.Current.GetFloorSortRoom(this.cloneRoom.FloorId);
                if (listRoom.Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null)
                {
                    this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom));
                    return false;
                }
            }
            return true;
        }
        #endregion
    }
    public Action<string> FinishEditorEvent = null;
    /// <summary>
    /// 列表控件
    /// </summary>
    private FrameListControl listview = null;
    /// <summary>
    /// 房间对象
    /// </summary>
    private Common.Room editorRoom = null;
    /// <summary>
    /// 克隆对象
    /// </summary>
    private Common.Room cloneRoom = null;
    /// <summary>
    /// 改变房间图片
    /// </summary>
    private bool changedRoomPic = false;
    #endregion
    #region ■ 初始化_____________________________
    /// <summary>
    /// 画面显示(底层会固定调用此方法,借以完成画面创建)
    /// </summary>
    /// <param name="i_editorRoom">编辑的房间对象</param>
    public void ShowForm(Common.Room i_editorRoom = null)
    {
      //弄一点初始值
      this.editorRoom = i_editorRoom;
      this.cloneRoom = HdlRoomLogic.Current.CloneRoomClass(i_editorRoom);
      //设置头部信息
      base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uEditorRoom));
      //初始化中部信息
      this.InitMiddleFrame();
    }
    /// <summary>
    /// 初始化中部信息
    /// </summary>
    private void InitMiddleFrame()
    {
      //清空bodyFrame
      this.ClearBodyFrame();
      var listBackControl = new VerticalFrameControl();
      listBackControl.Height = bodyFrameLayout.Height;
      bodyFrameLayout.AddChidren(listBackControl);
      //加一个白色背景
      var frameBack1 = new FrameLayout();
      frameBack1.Height = Application.GetRealHeight(750);
      frameBack1.Y = Application.GetRealHeight(196);
      frameBack1.BackgroundColor = UserCenterColor.Current.White;
      frameBack1.SetCornerWithSameRadius(Application.GetRealHeight(58), HDLUtils.RectCornerTopLeft | HDLUtils.RectCornerTopRight);
      listBackControl.frameTable.AddChidren(frameBack1);
      //房间图片底部阴影
      var btnShadow = new PicViewControl(853, 593);
      btnShadow.Y = Application.GetRealHeight(58);
      btnShadow.Gravity = Gravity.CenterHorizontal;
      btnShadow.UnSelectedImagePath = "Room/RoomShadow.png";
      listBackControl.frameTable.AddChidren(btnShadow);
      //房间图片
      var btnPic = new ImageView();
      btnPic.Y = Application.GetRealHeight(60);
      btnPic.Width = this.GetPictrueRealSize(824);
      btnPic.Height = this.GetPictrueRealSize(549);
      btnPic.Radius = (uint)Application.GetRealHeight(17);
      btnPic.Gravity = Gravity.CenterHorizontal;
      if (this.editorRoom.BackgroundImageType == 0)
      {
        btnPic.ImagePath = this.editorRoom.BackgroundImage;
      }
      else
      {
        btnPic.ImageBytes = Common.Global.ReadFileByHomeId(this.editorRoom.BackgroundImage);
      }
      listBackControl.frameTable.AddChidren(btnPic);
      //图片遮罩
      var btnZhezhao = new FrameLayout();
      btnZhezhao.Width = btnPic.Width;
      btnZhezhao.Height = btnPic.Height;
      btnZhezhao.Y = btnPic.Y;
      btnZhezhao.Gravity = Gravity.CenterHorizontal;
      btnZhezhao.BackgroundColor = UserCenterColor.Current.PictrueZhezhaoColor;
      btnZhezhao.Radius = (uint)Application.GetRealHeight(17);
      listBackControl.frameTable.AddChidren(btnZhezhao);
      //分享的房间不能编辑
      if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsShowTemplate == false)
      {
        btnZhezhao.MouseUpEventHandler += (sender, e) =>
        {
          //房间图片选择
          this.RoomPictrueSelect(btnPic);
        };
      }
      //初始化信息桌布
      var tableContr = new InformationEditorControl();
      this.listview = tableContr.InitControl(listBackControl.frameTable, Language.StringByID(R.MyInternationalizationString.uInfoEditor), bodyFrameLayout.Height - btnShadow.Bottom, false);
      //添加全部菜单
      this.AddAllMenuRow(tableContr, btnPic);
    }
    #endregion
    #region ■ 添加菜单___________________________
    /// <summary>
    /// 添加全部菜单
    /// </summary>
    private void AddAllMenuRow(InformationEditorControl tableContr, ImageView btnPic)
    {
      //【房间名称】
      FrameCaptionInputControl txtRoomName = null;
      if (this.editorRoom.IsLove == false)
      {
        txtRoomName = new FrameCaptionInputControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2);
        txtRoomName.txtInput.PlaceholderText = Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName);
        txtRoomName.txtInput.MaxByte = 48;//限制只能输入48个字节
        listview.AddChidren(txtRoomName);
        txtRoomName.InitControl();
        //底线
        txtRoomName.AddBottomLine();
      }
      else
      {
        //我的喜爱不能编辑名字
        var rowRoomName = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uRoomName), this.cloneRoom.Name, this.listview.rowSpace / 2);
        listview.AddChidren(rowRoomName);
        rowRoomName.UseClickStatu = false;
        rowRoomName.InitControl();
        //底线
        rowRoomName.AddBottomLine();
      }
      //该APP为有楼层的模式才开启这个菜单
      if (this.editorRoom.IsLove == false && string.IsNullOrEmpty(this.cloneRoom.FloorId) == false)
      {
        //【所属楼层】
        var btnBelone = new FrameCaptionViewControl(Language.StringByID(R.MyInternationalizationString.uBelongeFloor), Common.Config.Instance.Home.FloorDics[this.cloneRoom.FloorId], this.listview.rowSpace / 2);
        listview.AddChidren(btnBelone);
        btnBelone.InitControl();
        //底线
        btnBelone.AddBottomLine();
        //分享的房间不能修改
        if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsShowTemplate == false)
        {
          //右箭头
          btnBelone.AddRightArrow();
          btnBelone.ButtonClickEvent += (sender, e) =>
          {
            //楼层选择
            this.ShowSelectFloor(btnBelone);
          };
        }
      }
      //【温度】
      var rowTemperature = new FrameRowControl(this.listview.rowSpace / 2);
      listview.AddChidren(rowTemperature);
      rowTemperature.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uTemperature), 600);
      //右箭头
      rowTemperature.AddRightArrow();
      var btnTemper = rowTemperature.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300);
      //底线
      rowTemperature.AddBottomLine();
      //分享的房间不能修改 或者当前住宅不是虚拟的
      if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false
          && Common.Config.Instance.Home.IsShowTemplate == false)
      {
        rowTemperature.ButtonClickEvent += (sender, e) =>
        {
          //显示温度传感器列表
          this.ShowTemperatrueDevice(btnTemper);
        };
      }
      if (string.IsNullOrEmpty(cloneRoom.TemperatrueDevice) == false
          && Common.Config.Instance.Home.IsShowTemplate == false)
      {
        //获取温度
        this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice);
      }
      //【湿度】
      var rowHumidity = new FrameRowControl(this.listview.rowSpace / 2);
      listview.AddChidren(rowHumidity);
      rowHumidity.AddLeftCaption(Language.StringByID(R.MyInternationalizationString.uHumidity), 600);
      //右箭头
      rowHumidity.AddRightArrow();
      var btnHumi = rowHumidity.AddMostRightView(Language.StringByID(R.MyInternationalizationString.uNothing), 300);
      //底线
      rowHumidity.AddBottomLine();
      //分享的房间不能修改 或者当前住宅不是虚拟的
      if (this.editorRoom.IsSharedRoom == false && Common.Config.Instance.Home.IsVirtually == false
          && Common.Config.Instance.Home.IsShowTemplate == false)
      {
        rowHumidity.ButtonClickEvent += (sender, e) =>
        {
          //显示湿度传感器列表
          this.ShowHumidityDevice(btnHumi);
        };
      }
      if (string.IsNullOrEmpty(cloneRoom.HumidityDevice) == false
          && Common.Config.Instance.Home.IsShowTemplate == false)
      {
        //获取湿度
        this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice);
      }
      //初始化桌布完成
      tableContr.FinishInitControl();
      tableContr = null;
      //分享的房间不能保存
      if (this.editorRoom.IsSharedRoom == true || Common.Config.Instance.Home.IsShowTemplate == true)
      {
        return;
      }
      //保存
      var btnFinish = new BottomClickButton();
      btnFinish.TextID = R.MyInternationalizationString.uSave;
      bodyFrameLayout.AddChidren(btnFinish);
      btnFinish.ButtonClickEvent += (sender, e) =>
      {
        if (txtRoomName != null)
        {
          this.cloneRoom.Name = txtRoomName.Text;
        }
        //检测能否保存房间
        if (this.CheckCanSaveRoom() == false)
        {
          return;
        }
        //更改图片
        if (this.changedRoomPic == true)
        {
          if (editorRoom.BackgroundImageType == 1 || editorRoom.BackgroundImageType == 2)
          {
            //删除掉原来的自定义图片
            if (Common.Global.IsExistsByHomeId(editorRoom.BackgroundImage) == true)
            {
              Common.Global.DeleteFilebyHomeId(editorRoom.BackgroundImage);
            }
            //备份
            HdlAutoBackupLogic.DeleteFile(editorRoom.BackgroundImage);
          }
          //自定义图片
          if (cloneRoom.BackgroundImageType == 1 || cloneRoom.BackgroundImageType == 2)
          {
            //生成图片
            string picName = $"RoomIcon_{DateTime.Now.ToString("yyyyMMddHHmmss")}.png";
            string picFullName = System.IO.Path.Combine(Common.Config.Instance.FullPath, picName);
            Shared.IO.FileUtils.WriteFileByBytes(picFullName, btnPic.ImageBytes);
            cloneRoom.BackgroundImage = picName;
            //备份
            HdlAutoBackupLogic.AddOrEditorFile(picName);
          }
        }
        bool changedFloor = editorRoom.FloorId != cloneRoom.FloorId;
        editorRoom.FloorId = cloneRoom.FloorId;
        editorRoom.Name = cloneRoom.Name;
        editorRoom.HumidityDevice = cloneRoom.HumidityDevice;
        editorRoom.TemperatrueDevice = cloneRoom.TemperatrueDevice;
        editorRoom.BackgroundImage = cloneRoom.BackgroundImage;
        editorRoom.BackgroundImageType = cloneRoom.BackgroundImageType;
        editorRoom.Save();
        FinishEditorEvent?.Invoke(this.editorRoom.Name);
        if (changedFloor == false)
        {
          //刷新左滑的房间列表界面的指定房间的信息
          MainPage.LeftListRoomViewFrom.Instance.RefreshRoomInfo(this.editorRoom);
        }
        else
        {
          //刷新左滑的房间列表界面的房间列表信息
          MainPage.LeftListRoomViewFrom.Instance.RefreshListRoom();
        }
        //算了,这里如果按下保存,则主页需要重新刷新
        UserView.UserPage.Instance.RefreshAllForm = true;
        this.CloseForm();
      };
    }
    #endregion
    #region ■ 楼层选择___________________________
    /// <summary>
    /// 楼层选择
    /// </summary>
    /// <param name="control"></param>
    private void ShowSelectFloor(FrameCaptionViewControl control)
    {
      var dicFloor = HdlRoomLogic.Current.GetFloorSortList();
      var listKeys = new List<string>();
      var listName = new List<string>();
      int index = 0;
      foreach (string keys in dicFloor.Keys)
      {
        listKeys.Add(keys);
        listName.Add(dicFloor[keys]);
        if (keys == cloneRoom.FloorId)
        {
          index = listKeys.Count - 1;
        }
      }
      PickerView.Show(listName, (value) =>
      {
        control.txtView.Text = listName[value];
        //主键修改
        cloneRoom.FloorId = listKeys[value];
      },
      index,
      Language.StringByID(R.MyInternationalizationString.uBelongeFloor),
      Language.StringByID(R.MyInternationalizationString.uFinish),
      Language.StringByID(R.MyInternationalizationString.uCancel));
    }
    #endregion
    #region ■ 温度传感器相关_____________________
    /// <summary>
    /// 显示温度传感器列表
    /// </summary>
    /// <param name="btnTemper"></param>
    private void ShowTemperatrueDevice(NormalViewControl btnTemper)
    {
      var listDevice = new List<ZigBee.Device.CommonDevice>();
      foreach (var device in Common.LocalDevice.Current.listAllDevice)
      {
        //获取温度传感器
        if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 1)
        {
          listDevice.Add(device);
        }
        //PM2.5是温度和湿度合在同一个端点
        else if (device.Type == ZigBee.Device.DeviceType.PMSensor)
        {
          listDevice.Add(device);
        }
      }
      var listSelect = new List<string>() { cloneRoom.TemperatrueDevice };
      var form = new SelectDeviceForm();
      form.AddForm(listDevice, listSelect, true, true);
      form.ActionSelectDevice += (list) =>
      {
        if (list.Count == 0)
        {
          cloneRoom.TemperatrueDevice = string.Empty;
          btnTemper.Text = Language.StringByID(R.MyInternationalizationString.uNothing);
          return;
        }
        cloneRoom.TemperatrueDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]);
        //获取温度值
        this.GetTemperatrueValue(btnTemper, cloneRoom.TemperatrueDevice);
      };
    }
    /// <summary>
    /// 获取温度值
    /// </summary>
    /// <param name="btnHumi"></param>
    /// <param name="deviceKey"></param>
    private void GetTemperatrueValue(NormalViewControl btnTemper, string deviceKey)
    {
      var device = Common.LocalDevice.Current.GetDevice(deviceKey);
      if (device == null)
      {
        return;
      }
      //获取中
      btnTemper.Text = Language.StringByID(R.MyInternationalizationString.Getting);
      bool receiveData = false;
      HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice");
      HdlGatewayReceiveLogic.Current.AddAttributeEvent("TemperatrueDevice", ReceiveComandDiv.A设备属性上报, ((report) =>
      {
        string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
        //晾衣架上报需要特殊处理,其他上报的回路统一转为端点1
        //      var tempList = LocalDevice.Current.GetDevicesByMac(report.DeviceAddr);
        //var tempDeviceEnum = LocalDevice.Current.GetMyDeviceEnumInfo(tempList);
        //if (tempDeviceEnum.ConcreteType == Common.DeviceConcreteType.Airer)
        //{
        //  mainKeys = report.DeviceAddr + "_" + 1;
        //}
        if (cloneRoom.TemperatrueDevice != mainKeys || btnTemper == null
          || report.DeviceStatusReport.CluterID != 1026)
        {
          return;
        }
        receiveData = true;
        var localDevice = Common.LocalDevice.Current.GetDevice(mainKeys);
        HdlThreadLogic.Current.RunMain(() =>
              {
                decimal temperatrue = (decimal)device.GetType().InvokeMember("currentTemperature", System.Reflection.BindingFlags.GetField, null, device, null);
                if (temperatrue == 0)
                {
                  //0
                  btnTemper.Text = "0.0℃";
                }
                else
                {
                  btnTemper.Text = temperatrue + "℃";
                }
              }, ShowErrorMode.NO);
      }));
      //发送获取温度的命令
      device.ReadAttri(ZigBee.Device.Cluster_ID.TemperatureMeasurement, ZigBee.Device.AttriButeId.MeasuredValue);
      HdlThreadLogic.Current.RunThread(() =>
      {
        //去获取设备列表的信息
        System.Threading.Thread.Sleep(1500);
        var result = Common.LocalDevice.Current.ReadDeviceEpointDeviceInfo(device);
        if (result != null)
        {
          device.AttributeStatus.Clear();
          device.AttributeStatus.AddRange(result.AttributeStatus);
          device.ReSave();
        }
        if (receiveData == true)
        {
          //已经读取到数据
          return;
        }
        foreach (var data in device.AttributeStatus)
        {
          if (data.ClusterId == 1026
                   && data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
          {
            //处理网关返回的温度值
            decimal temperatrue = 0;
            this.AdjustTemperatrueValue(data.AttributeData, ref temperatrue);
            device.GetType().InvokeMember("currentTemperature", System.Reflection.BindingFlags.SetField, null, device, new object[] { temperatrue });
            device.ReSave();
            //制作虚假的属性上报
            var report = new ZigBee.Device.CommonDevice { DeviceAddr = device.DeviceAddr, DeviceEpoint = device.DeviceEpoint };
            report.DeviceStatusReport.CluterID = 1026;
            HdlGatewayReceiveLogic.Current.DeviceReportPush(report, ReceiveComandDiv.A设备属性上报);
            HdlThreadLogic.Current.RunMain(() =>
                  {
                    btnTemper.Text = temperatrue == 0 ? "0.0℃" : temperatrue.ToString() + "℃";
                  });
            break;
          }
        }
      });
    }
    /// <summary>
    /// 处理网关返回的温度值
    /// </summary>
    /// <param name="value">网关返回的属性值</param>
    /// <param name="temperatrue">转换成的温度值</param>
    private void AdjustTemperatrueValue(int value, ref decimal temperatrue)
    {
      if (value == 0)
      {
        //0℃
        temperatrue = 0;
      }
      else if (value > 32767)
      {
        //负数(特殊处理)
        string strValue = (value - 65536).ToString();
        //小数点需要一位
        strValue = strValue.Substring(0, strValue.Length - 1);
        //记录温度
        temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
      }
      else
      {
        //小数点需要一位
        string strValue = value.ToString();
        strValue = strValue.Substring(0, strValue.Length - 1);
        //记录温度
        temperatrue = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
      }
    }
    #endregion
    #region ■ 湿度传感器相关_____________________
    /// <summary>
    /// 显示湿度传感器列表
    /// </summary>
    /// <param name="btnHumi"></param>
    private void ShowHumidityDevice(NormalViewControl btnHumi)
    {
      var listDevice = new List<ZigBee.Device.CommonDevice>();
      foreach (var device in Common.LocalDevice.Current.listAllDevice)
      {
        //获取湿度传感器
        if (device is ZigBee.Device.TemperatureSensor && ((ZigBee.Device.TemperatureSensor)device).SensorDiv == 2)
        {
          listDevice.Add(device);
        }
        //新风
        else if (device.Type == ZigBee.Device.DeviceType.FreshAirHumiditySensor)
        {
          listDevice.Add(device);
        }
        //PM2.5是温度和湿度合在同一个端点
        else if (device.Type == ZigBee.Device.DeviceType.PMSensor)
        {
          listDevice.Add(device);
        }
      }
      var listSelect = new List<string>() { cloneRoom.HumidityDevice };
      var form = new SelectDeviceForm();
      form.AddForm(listDevice, listSelect, true, true);
      form.ActionSelectDevice += (list) =>
      {
        if (list.Count == 0)
        {
          cloneRoom.HumidityDevice = string.Empty;
          btnHumi.Text = Language.StringByID(R.MyInternationalizationString.uNothing);
          return;
        }
        cloneRoom.HumidityDevice = Common.LocalDevice.Current.GetDeviceMainKeys(list[0]);
        //获取湿度值
        this.GetHumidityValue(btnHumi, cloneRoom.HumidityDevice);
      };
    }
    /// <summary>
    /// 获取湿度值
    /// </summary>
    /// <param name="btnHumi"></param>
    /// <param name="deviceKey"></param>
    private void GetHumidityValue(NormalViewControl btnHumi, string deviceKey)
    {
      var device = Common.LocalDevice.Current.GetDevice(deviceKey);
      if (device == null)
      {
        return;
      }
      //获取中
      btnHumi.Text = Language.StringByID(R.MyInternationalizationString.Getting);
      bool receiveData = false;
      HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice");
      HdlGatewayReceiveLogic.Current.AddAttributeEvent("HumidityDevice", ReceiveComandDiv.A设备属性上报, (report) =>
      {
        string mainKeys = Common.LocalDevice.Current.GetDeviceMainKeys(report);
        if (cloneRoom.HumidityDevice != mainKeys || btnHumi == null
              || report.DeviceStatusReport.CluterID != 1029)
        {
          return;
        }
        receiveData = true;
        var localDevice = Common.LocalDevice.Current.GetDevice(mainKeys);
        HdlThreadLogic.Current.RunMain(() =>
              {
                decimal humidity = (decimal)localDevice.GetType().InvokeMember("currentHumidity", System.Reflection.BindingFlags.GetField, null, localDevice, null);
                if (humidity == 0)
                {
                  //0
                  btnHumi.Text = "0.0%";
                }
                else
                {
                  btnHumi.Text = humidity.ToString() + "%";
                }
              }, ShowErrorMode.NO);
      });
      //发送获取湿度的命令
      device.ReadAttri(ZigBee.Device.Cluster_ID.RelativeHumidityMeasurement, ZigBee.Device.AttriButeId.MeasuredValue);
      HdlThreadLogic.Current.RunThread(() =>
      {
        //去获取设备列表的信息
        System.Threading.Thread.Sleep(1500);
        var result = Common.LocalDevice.Current.ReadDeviceEpointDeviceInfo(device);
        if (result != null)
        {
          device.AttributeStatus.Clear();
          device.AttributeStatus.AddRange(result.AttributeStatus);
          device.ReSave();
        }
        if (receiveData == true)
        {
          //已经读到数据
          return;
        }
        //初始值,取缓存数据
        foreach (var data in device.AttributeStatus)
        {
          if (data.ClusterId == 1029
                   && data.AttributeId == (int)ZigBee.Device.AttriButeId.MeasuredValue)
          {
            //处理网关返回的湿度值
            decimal humidity = 0;
            this.AdjustHumidityValue(data.AttributeData, ref humidity);
            device.GetType().InvokeMember("currentHumidity", System.Reflection.BindingFlags.SetField, null, device, new object[] { humidity });
            device.ReSave();
            //制作虚假的属性上报
            var report = new ZigBee.Device.CommonDevice { DeviceAddr = device.DeviceAddr, DeviceEpoint = device.DeviceEpoint };
            report.DeviceStatusReport.CluterID = 1029;
            HdlGatewayReceiveLogic.Current.DeviceReportPush(report, ReceiveComandDiv.A设备属性上报);
            HdlThreadLogic.Current.RunMain(() =>
                  {
                    btnHumi.Text = humidity == 0 ? "0.0%" : humidity.ToString() + "%";
                  });
            break;
          }
        }
      });
    }
    /// <summary>
    /// 处理网关返回的湿度值
    /// </summary>
    /// <param name="value">网关返回的属性值</param>
    /// <param name="temperatrue">转换成的湿度值</param>
    /// <param name="valueText">转换成的湿度值的翻译文本</param>
    private void AdjustHumidityValue(int value, ref decimal humidity)
    {
      if (value == 0)
      {
        //0%
        humidity = 0;
      }
      //不会出现负数
      else
      {
        //小数点需要一位
        string strValue = value.ToString();
        strValue = strValue.Substring(0, strValue.Length - 1);
        //记录温度
        humidity = Convert.ToDecimal(strValue.Insert(strValue.Length - 1, "."));
      }
    }
    #endregion
    #region ■ 房间图片选择_______________________
    /// <summary>
    /// 房间图片选择
    /// </summary>
    /// <param name="imageContr"></param>
    private void RoomPictrueSelect(ImageView imageContr)
    {
      var menuContr = new BottomMenuSelectForm();
      menuContr.AddForm(3);
      //默认图库
      menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.LocalPicture), () =>
      {
        var form = new SelectLocalRoomImageForm();
        form.AddForm();
        form.FinishSelectEvent = (imgPath) =>
              {
                if (string.IsNullOrEmpty(imgPath) == true)
                {
                  return;
                }
                this.changedRoomPic = true;
                this.cloneRoom.BackgroundImageType = 0;
                this.cloneRoom.BackgroundImage = imgPath;
                imgPath = IO.FileUtils.GetImageFilePath(imgPath);
                imageContr.ImageBytes = IO.FileUtils.ReadFile(imgPath);
              };
      });
      //拍照
      menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.Photograph), () =>
      {
        //通过相机拍照裁剪
        CropImage.TakePicture((imagePath) =>
        {
          if (string.IsNullOrEmpty(imagePath) == true)
          {
            return;
          }
          this.changedRoomPic = true;
          this.cloneRoom.BackgroundImageType = 1;
          imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath);
          System.IO.File.Delete(imagePath);
        }, "HdlPic", 2, 1);
      });
      //我的相册
      menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.MyAblums), () =>
      {
        //从相册选择图片裁剪
        CropImage.SelectPicture((imagePath) =>
        {
          if (string.IsNullOrEmpty(imagePath) == true)
          {
            return;
          }
          this.changedRoomPic = true;
          this.cloneRoom.BackgroundImageType = 2;
          imageContr.ImageBytes = Shared.IO.FileUtils.ReadFile(imagePath);
          System.IO.File.Delete(imagePath);
        }, "HdlPic", 2, 1);
      });
    }
    #endregion
    #region ■ 界面关闭___________________________
    /// <summary>
    /// 界面关闭
    /// </summary>
    public override void CloseFormBefore()
    {
      this.FinishEditorEvent = null;
      HdlGatewayReceiveLogic.Current.RemoveEvent("TemperatrueDevice");
      HdlGatewayReceiveLogic.Current.RemoveEvent("HumidityDevice");
      base.CloseFormBefore();
    }
    #endregion
    #region ■ 一般方法___________________________
    /// <summary>
    /// 检测能否保存房间
    /// </summary>
    /// <returns></returns>
    private bool CheckCanSaveRoom()
    {
      if (this.cloneRoom.Name == string.Empty)
      {
        //请输入房间名称
        this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.uPleaseInputRoomName));
        return false;
      }
      if (string.IsNullOrEmpty(this.cloneRoom.FloorId) == true)
      {
        if (HdlRoomLogic.Current.GetAllListRooms().Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null)
        {
          this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom));
          return false;
        }
      }
      else
      {
        var listRoom = HdlRoomLogic.Current.GetFloorSortRoom(this.cloneRoom.FloorId);
        if (listRoom.Find((obj) => obj.Name == this.cloneRoom.Name && obj.Id != this.cloneRoom.Id) != null)
        {
          this.ShowMassage(ShowMsgType.Error, Language.StringByID(R.MyInternationalizationString.HadSameRoom));
          return false;
        }
      }
      return true;
    }
    #endregion
  }
}