黄学彪
2020-11-19 9ef48d7b2da7c408b53f73be0f6eef3cbac1c84a
ZigbeeApp/Shared/Phone/UserCenter/CommonBase/Controls/CompoundControls/TopRightMenuControl.cs
@@ -5,7 +5,7 @@
namespace Shared.Phone.UserCenter
{
    /// <summary>
    /// 做成一个存在于右上角的菜单控件
    /// 做成一个存在于右上角的菜单控件(非楼层菜单,都可以使用)
    /// </summary>
    public class TopRightMenuControl : FrameLayout
    {
@@ -16,9 +16,9 @@
        /// </summary>
        private VerticalListControl listView = null;
        /// <summary>
        /// 前回选择的行
        /// 背景容器控件
        /// </summary>
        private FrameRowControl oldRowFrame = null;
        private FrameLayout frameBack = null;
        /// <summary>
        /// 行高度
        /// </summary>
@@ -37,23 +37,33 @@
        #region ■ 初始化_____________________________
        /// <summary>
        /// 做成一个存在于右上角的菜单控件
        /// 做成一个存在于右上角的菜单控件(非楼层菜单,都可以使用)
        /// </summary>
        /// <param name="i_RowCount">一共有几行</param>
        /// <param name="i_width">这个菜单有多宽</param>
        /// <param name="i_RowCount">一共有几行(不含标题)</param>
        /// <param name="i_widthType">这个菜单的宽度模式,目前只支持
        /// <para>1: 395宽度</para>
        /// <para>2: 449宽度</para>
        /// </param>
        /// <param name="titleText">标题文本(如果不为空,菜单模式变更为拥有标题的模式)</param>
        public TopRightMenuControl(int i_RowCount, int i_width = 395, string titleText = null)
        public TopRightMenuControl(int i_RowCount, int i_widthType, string titleText = null)
        {
            this.RowCount = i_RowCount;
            this.RowWidth = i_width;
            if (i_widthType == 1)
            {
                this.RowWidth = 395;
            }
            else if (i_widthType == 2)
            {
                this.RowWidth = 449;
            }
            //初始化画面的控件
            this.InitFormControl(titleText);
            this.InitFormControl(titleText, i_widthType);
        }
        /// <summary>
        /// 初始化画面的控件
        /// </summary>
        private void InitFormControl(string titleText)
        private void InitFormControl(string titleText, int i_widthType)
        {
            this.BackgroundColor = UserCenterColor.Current.DialogBackColor;
            this.MouseUpEventHandler += (sender2, e2) =>
@@ -66,48 +76,54 @@
            //最大显示5个
            int rowCount = this.RowCount > 5 ? 5 : this.RowCount;
            //桌布
            if (titleText != null)
            {
                //449宽度的时候,即使明细已经超过了5个,但是还是可以+1的,因为这个模式多了一张图片
                if (rowCount < 5 || i_widthType == 2)
                {
                    //菜单+1
                    rowCount++;
                }
            }
            //背景
            this.frameBack = new FrameLayout();
            frameBack.X = Application.GetRealWidth(662 - (RowWidth - 395));
            frameBack.Y = Application.GetRealHeight(161);
            frameBack.Width = Application.GetRealWidth(RowWidth);
            frameBack.Height = Application.GetRealHeight(RowHeight * rowCount + 16);
            frameBack.BackgroundImagePath = "MenuGroud/TopRightMenu" + i_widthType + "_" + rowCount + ".png";
            this.AddChidren(frameBack);
            var frameTable = new FrameLayout();
            frameTable.X = Application.GetRealWidth(662 - (RowWidth - 395));
            frameTable.Y = Application.GetRealHeight(158 + 15 + 1);
            frameTable.Width = Application.GetRealWidth(RowWidth);
            frameTable.Y = Application.GetRealHeight(16);
            frameTable.Height = Application.GetRealHeight(RowHeight * rowCount);
            frameTable.BackgroundColor = UserCenterColor.Current.White;
            frameTable.BorderColor = UserCenterColor.Current.Transparent;
            frameTable.Radius = 6;
            this.AddChidren(frameTable);
            frameBack.AddChidren(frameTable);
            if (titleText != null)
            {
                var btnTitle = new NormalViewControl(frameTable.Width - Application.GetRealWidth(81), Application.GetRealHeight(58), false);
                var btnTitle = new NormalViewControl(frameBack.Width - Application.GetRealWidth(81), Application.GetRealHeight(58), false);
                btnTitle.X = Application.GetRealWidth(81);
                btnTitle.Y = Application.GetRealHeight(58);
                btnTitle.Y = Application.GetRealHeight(58 + 16);
                btnTitle.Text = titleText;
                frameTable.AddChidren(btnTitle);
            }
            //列表控件
            this.listView = new VerticalListControl();
            listView.Height = frameTable.Height;
            if (rowCount == 5)
            {
                //连带标题,只能显示5行
                listView.Height = frameTable.Height - Application.GetRealHeight(RowHeight);
            }
            listView.Radius = (uint)Application.GetRealHeight(17);
            if (titleText != null)
            {
                //拥有标题
                listView.Y = Application.GetRealHeight(RowHeight);
                listView.Height = frameTable.Height - Application.GetRealHeight(RowHeight);
            }
            listView.Radius = frameTable.Radius;
            else
            {
                //没有标题
                listView.Height = frameTable.Height;
            }
            frameTable.AddChidren(listView);
            //三角形图标
            var btnTriangle = new PicViewControl(31, 15);
            btnTriangle.X = Application.GetRealWidth(980);
            btnTriangle.Y = Application.GetRealHeight(159);
            btnTriangle.UnSelectedImagePath = "Item/UpperTriangle.png";
            this.AddChidren(btnTriangle);
        }
        #endregion
@@ -115,24 +131,29 @@
        #region ■ 添加菜单___________________________
        /// <summary>
        /// 添加菜单行
        /// 添加菜单行(UI奇葩变更了,暗色图片为选中,黑色图片为非选中)
        /// </summary>
        /// <param name="TextValue">显示的文字</param>
        /// <param name="unSelectPic">图片</param>
        /// <param name="selectPic">图片</param>
        /// <param name="selectPic">图片(暗色图片)</param>
        /// <param name="unSelectPic">图片(黑色图片)</param>
        /// <param name="action">单击菜单执行的事件</param>
        /// <param name="closeOnClick">单击的时候,关闭菜单</param>
        public void AddRowMenu(string TextValue, string unSelectPic, string selectPic, Action action, bool closeOnClick = true)
        public void AddRowMenu(string TextValue, string selectPic, string unSelectPic, Action action, bool closeOnClick = true)
        {
            var rowFrame = new FrameRowControl();
            rowFrame.LeftOffset = Application.GetRealWidth(81) - ControlCommonResourse.XXLeft;
            rowFrame.Height = Application.GetRealHeight(RowHeight);
            listView.AddChidren(rowFrame);
            rowFrame.MainKeys = listView.ChildrenCount.ToString();
            //这里特殊,移除掉自身的单击事件
            rowFrame.RemoveBaseClickEvent();
            //图标
            var btnIcon = rowFrame.AddLeftIcon(81);
            btnIcon.UnSelectedImagePath = unSelectPic;
            btnIcon.SelectedImagePath = selectPic;
            if (selectPic != null)
            {
                btnIcon.SelectedImagePath = selectPic;
            }
            //显示文字
            var btnText = rowFrame.AddLeftCaption(TextValue, RowWidth - 173);
            btnText.X = Application.GetRealWidth(173);
@@ -143,39 +164,43 @@
                btnLine.X = Application.GetRealWidth(81);
            }
            if (listView.ChildrenCount == 1)
            {
                //第一个菜单默认设置为选择状态
                this.SetRowSelectStatu(rowFrame, true);
                this.oldRowFrame = rowFrame;
            }
            else
            {
                //其他菜单为灰色
                btnIcon.IsSelected = false;
                btnText.TextColor = UserCenterColor.Current.TextGrayColor1;
            }
            //初始状态全为非选中状态
            this.SetRowSelectStatu(rowFrame, false);
            //选择状态
            bool happenMove = false;
            //选择状态(重写底层效果)
            rowFrame.SelectStatuEvent += (statu) =>
            {
                //false为控件自身自动执行,这里不需要还原
                //false为状态还原,但是状态还原放在鼠标弹起事件里面
                if (statu == true)
                {
                    //设置为选择状态
                    this.SetRowSelectStatu(rowFrame, true);
                    this.oldRowFrame = rowFrame;
                    happenMove = false;
                }
            };
            //按键点击
            rowFrame.ButtonClickEvent += (sender, e) =>
            {
                //设置为非选择状态
                this.SetRowSelectStatu(rowFrame, false);
                if (closeOnClick == true)
                {
                    this.RemoveFromParent();
                }
                action?.Invoke();
            };
            //开始触发移动事件(这个事件会频繁的触发)
            btnIcon.ButtonHappenMoveEvent += () =>
            {
                if (happenMove == false)
                {
                    //设置为非选择状态
                    this.SetRowSelectStatu(rowFrame, false);
                }
                happenMove = true;
            };
        }
        #endregion
@@ -193,22 +218,43 @@
            var btnIcon = (IconViewControl)frame.GetChildren(0);
            if (btnIcon != null)
            {
                btnIcon.IsSelected = select;
                if (select == true && string.IsNullOrEmpty(btnIcon.SelectedImagePath) == true)
                {
                    //如果不设置这张图片,则什么都不做
                }
                else
                {
                    btnIcon.IsSelected = select;
                }
            }
            //文本
            var btnText = (NormalViewControl)frame.GetChildren(1);
            if (btnText != null)
            {
                btnText.TextColor = select == true ? UserCenterColor.Current.TextColor1 : UserCenterColor.Current.TextGrayColor1;
                btnText.TextColor = select == true ? UserCenterColor.Current.TextGrayColor1 : UserCenterColor.Current.TextColor1;
                btnText.IsBold = !select;
            }
            //前回选择的菜单为null,或者是相同的东西,则不处理
            if (this.oldRowFrame == null || this.oldRowFrame.MainKeys == frame.MainKeys)
            {
                return;
            }
        }
            //前回选择的行还原
            this.SetRowSelectStatu(this.oldRowFrame, false);
        #endregion
        #region ■ 一般方法___________________________
        /// <summary>
        /// 重新设置白色部分的坐标
        /// </summary>
        /// <param name="XX">真实值(不改变的话填-1)</param>
        /// <param name="YY">真实值(不改变的话填-1)</param>
        public void SetLocation(int XX = -1, int YY = -1)
        {
            if (XX != -1)
            {
                frameBack.X = XX;
            }
            if (YY != -1)
            {
                frameBack.Y = YY;
            }
        }
        #endregion