using System; using System.Collections.Generic; using System.Text; namespace Shared.Phone.UserCenter.UserMain { /// /// 消息中心 /// public class MessageManagementForm : EditorCommonForm { #region ■ 变量声明___________________________ /// /// 列表控件 /// private VerticalFrameRefreshControl listView = null; /// /// 全部的行 /// private Dictionary dicAllRow = null; #endregion #region ■ 初始化_____________________________ /// /// 画面显示(底层会固定调用此方法,借以完成画面创建) /// public void ShowForm() { //设置头部信息 base.SetTitleText(Language.StringByID(R.MyInternationalizationString.uMessageCenter)); //初始化右上角菜单 this.InitTopRightMenu(); listView = new VerticalFrameRefreshControl(35); listView.Height = bodyFrameLayout.Height; bodyFrameLayout.AddChidren(listView); listView.BeginHeaderRefreshingAction += () => { HdlThreadLogic.Current.RunThread(() => { //初始化中部信息 this.InitMiddleData(false); }); }; HdlThreadLogic.Current.RunThread(() => { //打开进度条 this.ShowProgressBar(); //初始化中部信息 this.InitMiddleData(true); }); } /// /// 初始化中部信息 /// private async void InitMiddleData(bool showReload) { //获取数据 var dicData = await this.GetMessageData(); //关闭进度条 this.CloseProgressBar(dicData == null && showReload == true ? ShowReLoadMode.YES : ShowReLoadMode.NO); HdlThreadLogic.Current.RunMain(() => { //关闭刷新特效 listView?.EndHeaderRefreshing(); }); if (dicData == null) { //数据异常 return; } HdlThreadLogic.Current.RunMain(() => { //初始化中部控件 this.InitMiddleFrame(dicData); }); } /// /// 初始化中部控件 /// /// private void InitMiddleFrame(Dictionary> dicData) { //清空 listView.RemoveAll(); int index = 0; foreach (var keys in dicData.Keys) { var listData = dicData[keys]; index++; //容器 var framBack = new FrameListControl(23); framBack.Name = index.ToString(); framBack.Height = Application.GetRealHeight(100); framBack.BackgroundColor = UserCenterColor.Current.White; listView.AddChidrenFrame(framBack); //日期 string strMonth = Language.StringByID(R.MyInternationalizationString.Month); string strDate = Language.StringByID(R.MyInternationalizationString.Day); var frameDate = new FrameLayout(); frameDate.Height = Application.GetRealHeight(118); framBack.AddChidren(frameDate); var btnDate = new NormalViewControl(500, 60, true); btnDate.TextSize = 15; btnDate.X = ControlCommonResourse.XXLeft; btnDate.Y = Application.GetRealHeight(35); btnDate.Text = Convert.ToDateTime(listData[0].MsgTime).ToString("MM" + strMonth + "dd" + strDate); frameDate.AddChidren(btnDate); for (int i = 0; i < listData.Count; i++) { //添加信息行 this.AddMsgRowControl(framBack, listData[i], i != listData.Count - 1); } //调整高度 listView.AdjustChidrenFrameHeight(framBack, Application.GetRealHeight(23)); if (index == dicData.Count) { listView.AdjustTableHeight(); } } } #endregion #region ■ 右上角菜单_________________________ /// /// 初始化右上角菜单 /// private void InitTopRightMenu() { var btnIcon = new MostRightIconControl(69, 69); btnIcon.UnSelectedImagePath = "Item/More.png"; topFrameLayout.AddChidren(btnIcon); btnIcon.InitControl(); btnIcon.ButtonClickEvent += ((sender, e) => { //显示底部菜单界面 this.ShowBottomMenu(); }); } /// /// 显示底部菜单界面 /// private void ShowBottomMenu() { var menuContr = new BottomMenuSelectForm(); menuContr.AddForm(2); //全部已读 menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.uAllRead), () => { //设置全部为已读 this.SetAllTickIsRead(); }); //全部删除 menuContr.AddMenu(Language.StringByID(R.MyInternationalizationString.uAllDelete), () => { //删除全部的消息 this.DeleteAllMsg(); }); } #endregion #region ■ 添加信息行_________________________ /// /// 添加信息行 /// /// /// /// private void AddMsgRowControl(FrameListControl frameList, MessageRecordInfo recordInfo, bool addLine) { var rowControl = new RowLayoutControl(frameList.rowSpace / 2); frameList.AddChidren(rowControl); rowControl.Name = frameList.ChildrenCount.ToString(); rowControl.MainKeys = recordInfo.Id; this.dicAllRow[frameList.Name + "-" + rowControl.Name] = rowControl; //图标(现在测试) var btnIcon = rowControl.frameTable.AddLeftIcon(81); btnIcon.UnSelectedImagePath = "Item/Safety.png"; //消息类型 var btnMsgObject = rowControl.frameTable.AddLeftCaption("报警消息", 600); PicViewControl btnNewTip = null; if (recordInfo.IsRead == 0) { btnNewTip = new PicViewControl(78, 55); btnNewTip.UnSelectedImagePath = "Item/NewVersion.png"; btnNewTip.Y = Application.GetRealHeight(9) + rowControl.frameTable.chidrenYaxis; btnNewTip.X = btnMsgObject.X + btnMsgObject.GetRealWidthByText(14); rowControl.frameTable.AddChidren(btnNewTip, ChidrenBindMode.BindEventOnly); } //消息 var btnMsg = rowControl.frameTable.AddMostRightView(recordInfo.MsgContent, 600, 60); btnMsg.TextColor = UserCenterColor.Current.TextGrayColor3; btnMsg.Y = Application.GetRealHeight(5) + rowControl.frameTable.chidrenYaxis; rowControl.frameTable.AddChidren(btnMsg, ChidrenBindMode.BindEventOnly); //时间 var btnTime = rowControl.frameTable.AddMostRightView(recordInfo.MsgContent, 200, 50); btnTime.TextColor = UserCenterColor.Current.TextGrayColor1; btnTime.Y = btnMsg.Bottom + Application.GetRealHeight(12); btnTime.Text = Convert.ToDateTime(recordInfo.MsgTime).ToString("HH:mm"); rowControl.frameTable.AddChidren(btnTime, ChidrenBindMode.BindEventOnly); //底线 if (addLine == true) { rowControl.frameTable.AddBottomLine(); } //已读 if (recordInfo.IsRead == 1) { rowControl.frameTable.UseClickStatu = false; //消息类型 btnMsgObject.TextColor = UserCenterColor.Current.TextGrayColor1; //消息 btnMsg.TextColor = UserCenterColor.Current.TextGrayColor1; } //删除 var btnDelete = rowControl.AddDeleteControl(); btnDelete.ButtonClickEvent += (sender, e) => { //确认删除消息? string msg = Language.StringByID(R.MyInternationalizationString.uDeleteMessageMsg); this.ShowMassage(ShowMsgType.Confirm, msg, async () => { await this.DeleteMsg(recordInfo.Id, frameList, rowControl); }); }; //点击 rowControl.frameTable.ButtonClickEvent += async (sender, e) => { if (recordInfo.IsRead == 1) { return; } recordInfo.IsRead = 1; rowControl.frameTable.UseClickStatu = false; //消息类型 btnMsgObject.TextColor = UserCenterColor.Current.TextGrayColor1; //消息 btnMsg.TextColor = UserCenterColor.Current.TextGrayColor1; btnNewTip.RemoveFromParent(); if (sender != null) { //标记已读(不管它成功不成功) await this.SetTickIsRead(recordInfo.Id); } }; } #endregion #region ■ 标记已读___________________________ /// /// 标记已读 /// /// private async System.Threading.Tasks.Task SetTickIsRead(string strId) { string strUrl = "ZigbeeUsers/TickIsRead?Id=" + strId; var result = await Common.CommonPage.Instance.RequestHttpsZigbeeBytesResultAsync(strUrl, null, "GET"); if (result == null) { return UserCenterLogic.CheckNotEorrorMsg(null, "ZigbeeUsers/TickIsRead", null, null); } //云端是不会返回东西的 return true; } /// /// 设置全部为已读 /// private void SetAllTickIsRead() { if (dicAllRow.Count == 0) { return; } //确认标记全部消息为已读? this.ShowMassage(ShowMsgType.Confirm, Language.StringByID(R.MyInternationalizationString.uUnTipAllMessageMsg), () => { HdlThreadLogic.Current.RunThread(async () => { //打开进度条 this.ShowProgressBar(); foreach (var contr in this.dicAllRow.Values) { //标识全部为已读 var result = await this.SetTickIsRead(contr.MainKeys); if (result == false) { //关闭进度条 this.CloseProgressBar(); return; } } //关闭进度条 this.CloseProgressBar(); HdlThreadLogic.Current.RunMain(() => { //设置全部状态 foreach (var contr in this.dicAllRow.Values) { contr.frameTable.ButtonClickEvent?.Invoke(null, null); } }); }); }); } #endregion #region ■ 删除信息___________________________ /// /// 删除信息 /// /// /// /// private async System.Threading.Tasks.Task DeleteMsg(string strId, FrameListControl frameList, RowLayoutControl rowContr) { string strUrl = "ZigbeeUsers/DeletePushMessage?Id=" + strId; var result = await Common.CommonPage.Instance.RequestHttpsZigbeeBytesResultAsync(strUrl, null, "GET"); if (result == null) { return UserCenterLogic.CheckNotEorrorMsg(null, "ZigbeeUsers/DeletePushMessage", null, null); } //云端是不会返回东西的 if (frameList != null) { HdlThreadLogic.Current.RunMain(() => { //移除缓存 this.dicAllRow.Remove(frameList.Name + "-" + rowContr.Name); //调整控件位置 this.AdjustControlLocation(frameList, rowContr); }); } return true; } /// /// 删除全部的消息 /// private void DeleteAllMsg() { if (dicAllRow.Count == 0) { return; } //确认删除全部消息? this.ShowMassage(ShowMsgType.Confirm, Language.StringByID(R.MyInternationalizationString.uDeleteAllMessageMsg), () => { HdlThreadLogic.Current.RunThread(async () => { //打开进度条 this.ShowProgressBar(); foreach (var contr in this.dicAllRow.Values) { //删除全部消息 var result = await this.DeleteMsg(contr.MainKeys, null, null); if (result == false) { //关闭进度条 this.CloseProgressBar(); return; } } //初始化中部信息 this.InitMiddleData(true); }); }); } #endregion #region ■ 调整控件位置_______________________ /// /// 调整控件位置 /// /// private void AdjustControlLocation(FrameListControl frameList, RowLayoutControl removeRow) { int changedHeight = frameList.GetChildren(frameList.ChildrenCount - 1).Height; if (frameList.ChildrenCount <= 2) { //已经删完了,只剩下标题日期了 changedHeight = frameList.Height; } //先调整各自容器的Y轴坐标 bool canChangedLoaction = false; for (int i = 0; i < this.listView.frameTable.ChildrenCount; i++) { var myView = this.listView.frameTable.GetChildren(i); if (myView.Name == frameList.Name) { //它之后的控件全部往上移动 canChangedLoaction = true; continue; } if (canChangedLoaction == true) { myView.Y -= changedHeight; } } //调整父容器大小 this.listView.AdjustTableHeight(); if (frameList.ChildrenCount <= 2) { //已经删完了,只剩下标题日期了 frameList.RemoveFromParent(); } else { //这个容器里面被移除的行的下面的全部行,往上移动 bool changedFlage = false; for (int i = 0; i < frameList.ChildrenCount; i++) { var myView = frameList.GetChildren(i); if (myView.Name == removeRow.Name) { //它之后的控件全部往上移动 changedFlage = true; continue; } if (changedFlage == true) { myView.Y -= changedHeight; } } //移除指定的行 removeRow.RemoveFromParent(); //容器大小减少 frameList.Height -= changedHeight; } } #endregion #region ■ 获取数据___________________________ /// /// 获取消息记录 /// /// private async System.Threading.Tasks.Task>> GetMessageData() { this.dicAllRow = new Dictionary(); var result = await UserCenterLogic.GetResponseDataByRequestHttps("ZigbeeUsers/GetPushMessageRecord", false, ""); if (result == null) { return null; } var dataInfo = Newtonsoft.Json.JsonConvert.DeserializeObject>(result); //合并数据 return this.MergeMessageRecordData(dataInfo); } /// /// 合并数据 /// /// /// private Dictionary> MergeMessageRecordData(List dataInfo) { var dicData = new Dictionary>(); //首先先排序一下,时间大的放在前面 var dicTemp = new Dictionary>(); var listSortKeys = new List(); foreach (var data in dataInfo) { if (dicTemp.ContainsKey(data.MsgTime) == false) { dicTemp[data.MsgTime] = new List(); listSortKeys.Add(data.MsgTime); } dicTemp[data.MsgTime].Add(data); } listSortKeys.Sort(); for (int i = listSortKeys.Count - 1; i >= 0; i--) { var listData = dicTemp[listSortKeys[i]]; foreach (var data2 in listData) { string[] myArry = data2.MsgTime.Split(new string[] { "T" }, StringSplitOptions.RemoveEmptyEntries); if (myArry.Length != 2) { continue; } if (dicData.ContainsKey(myArry[0]) == false) { dicData[myArry[0]] = new List(); } dicData[myArry[0]].Add(data2); } } return dicData; } #endregion } }