在咱们一般的运用体系内部,由于系统是面向差别档次的用户,咱们所见到的菜系会更为多,多或多或少的依然上百个,不过大家实在工作接触的菜谱可能正是那么多少个,那么对于那种巨大的菜系连串,寻找起来十三分不方便。由此对菜单的脾性化配置就显得更为重庆大学,本篇随笔就是根据那样的眼光,提供用户对可知菜单实行多少个动态配置,只选自身喜欢、常用的食谱显示出来即可,菜单的布置存款和储蓄在数据Curry面,在分化的客户端体验都以同等。本篇小说首要介绍达成如此的成效的一个一体化思路,部分代码逻辑可供参考。

一 、 菜单列表的动态特性化配置的进度

在大家有个别软件里面,我们大概在界面上顶部放置菜单,也大概在界面包车型大巴左手停放树形列表菜单,那种意况都有也许,本篇摘取当中之一,右边菜单实行贰个介绍菜单的配备处理。

比如大家在右侧依据用户权限显示相关的菜系音信,动态变化整个列表展示,大概的界面效果如下所示。

XML 1

接下来在遵从列表上提供二个右键的食谱实行菜单的基础代谢、配置管理,如下界面所示。

XML 2

通过陈设成效,大家让用户进入二个布局管理界面,在中间陈设显示自身感兴趣的菜系,然后开始展览封存即可,保存后同时刷新界面包车型地铁职能菜单呈现。

XML 3

如上多少个界面效果就是为了介绍任何菜单配置管理的相似经过,之所以把界面效果放在前方介绍,便是可以让我们有1个像样原型设计格局的感性认识,驾驭了相关的处理进度,大家就足以出手通过编码的艺术来促成这些处理逻辑了。

贰 、菜单动态个性化配置的功效达成

地点介绍了大概的界面效果,有了参考,大家得以把它的兑现思路通过代码完成出来。

1)参数的数据存款和储蓄

首先大家须要掌握,用户配置能够经过XML保存在本地,也得以透过数据仓库储存款和储蓄保存在服务器,后者在分布式的客户端的时候,能够四处一样,那样就不会导致体验上的异样,因而大家那边运用储存在数据库的方案。

其一蕴藏大家沿用自身事先介绍过的安排管理组件(SettingsProvider.net),笔者在小说《Winform开发框架之参数配置管理功效完结-基于SettingsProvider.net的营造》中对它的利用进行了详实的牵线。

以此布局管理组件SettingsProvider.net使用起来也是比较便宜的,能够选用仓库储存在地头的靶子,也足以挑选仓库储存在数据库的储存对象。

首先咱们先定义二个囤积的参数类,这么些是行使那么些组件所不可不的蕴藏对象音讯,如下代码所示。

    /// <summary>
    /// 用来控制人员管理显示菜单的参数配置
    /// </summary>
    public class UserMenuParameter
    {
        [DefaultValue("")]
        [Description("用户ID")]
        public string UserID { get; set; }


        [Description("用户设置可见的菜单")]
        public Dictionary<string, bool> VisibleDict { get; set; }
    }

内需取得或存款和储蓄这些目的消息的时候,大家初步化多少个管理类,如下代码所示。

        //参数存储所需的相关对象
        private SettingsProvider settings;
        private ISettingsStorage store;
        private UserMenuParameter parameter;

接下来在安顿管理界面窗体里面,早先化那多少个目的,如下代码所示。

                // PortableStorage: 在运行程序目录创建一个setting的文件记录参数数据
                // DatabaseStorage:在数据库TB_UserParameter表存储用户配置参数
                store = new DatabaseStorage(LoginUserInfo.ID);
                settings = new SettingsProvider(store);
                parameter = settings.GetSettings<UserMenuParameter>();

诸如此类我们就可以依据用户的ID,获取相应记录的新闻并更换为相关的对象了,假诺大家须要把修改的新闻写会到存款和储蓄介质里面,代码如下所示。

            try
            {
                parameter = settings.GetSettings<UserMenuParameter>();
                parameter.VisibleDict = dict;
                parameter.UserID = LoginUserInfo.ID;
                settings.SaveSettings<UserMenuParameter>(parameter);

                ProcessDataSaved(sender, e);//触发外部事件

                this.DialogResult = System.Windows.Forms.DialogResult.OK;
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex);
                MessageDxUtil.ShowError(ex.Message);
                return;
            }

2)配置管理界面包车型地铁完毕

缓解了参数的获取及仓库储存功效后,大家必要编写制定多个界面来治本用户的菜谱配置,相当于我们前边介绍的菜系配置管理界面。

XML 4

作者们以此界面包车型地铁概念代码如下所示。

XML 5

其中参数的数量存款和储蓄正是使用了前方介绍的代码,那里须要依照用户的布署项初叶化树形菜单的显得处理,通过InitTree的函数完成菜单的来得。

XML,在显示菜单前,大家先介绍一下成效菜单呈现的规则,仅当参数存在对应记录,并且该记录显式设置不可知,菜单才不可知,不然暗许菜单是足以看看的。

这么保险了,在参数没有安排前,全部的食谱对当前用户是可知的,唯有用户设置为不不可知,该菜单才不显得为不可知。

        /// <summary>
        /// 获取菜单是否可见。
        /// 仅当参数存在对应记录,并且该记录显式设置不可见,菜单才不可见,否则默认菜单是可以看到的。
        /// </summary>
        /// <param name="id">菜单ID</param>
        /// <returns></returns>
        private bool GetVisibleMenu(string id)
        {
            bool result = true;
            if (parameter != null)
            {
                var dict = parameter.VisibleDict;
                if(dict != null && dict.ContainsKey(id))
                {
                    result = dict[id];
                }
            }
            return result;
        }

来得菜单的相关处理逻辑,正是基于地方的判断,然后鲜明是还是不是勾选记录,如下代码所示。

XML 6

存款和储蓄用户勾选的笔录的时候,大家需求遍历整个树节点,判断勾选了那几个采取,然后把它保存数据库即可。

        /// <summary>
        /// 递归获取选中的树节点集合
        /// </summary>
        /// <param name="node">树节点</param>
        /// <param name="dict">字典集合</param>
        /// <returns></returns>
        private Dictionary<string, bool> GetTreeSelection(TreeNode node, Dictionary<string, bool> dict)
        {
            if (node.Tag != null)
            {
                var check = node.Checked;
                var menuId = string.Concat(node.Tag);
                if(!dict.ContainsKey(menuId))
                {
                    dict.Add(menuId, check);
                }
            }

            foreach (TreeNode child in node.Nodes)
            {
                GetTreeSelection(child, dict);
            }

            return dict;
        }

参数的保留操作如下所示。

        /// <summary>
        /// 保存用户配置信息
        /// </summary>
        private void btnOK_Click(object sender, EventArgs e)
        {
            //获取用户勾选的树列表,存放在字典集合里面
            var dict = new Dictionary<string, bool>();
            foreach(TreeNode node in this.treeView1.Nodes)
            {
                GetTreeSelection(node, dict);
            }

            try
            {
                //重新获取参数信息,并设置新值后保存
                parameter = settings.GetSettings<UserMenuParameter>();
                parameter.VisibleDict = dict;
                parameter.UserID = LoginUserInfo.ID;
                settings.SaveSettings<UserMenuParameter>(parameter);

                ProcessDataSaved(sender, e);//触发外部事件

                this.DialogResult = System.Windows.Forms.DialogResult.OK;
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex);
                MessageDxUtil.ShowError(ex.Message);
                return;
            }
        }

3)主界面包车型地铁相干处理

如上处理完了后,我们在主界面包车型地铁工具栏右键菜单添加三个菜单项,用来进入配置界面包车型地铁,如下逻辑代码所示。

        private void tool_MenuSetting_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            MenuSetting();
        }
        /// <summary>
        /// 配置菜单项
        /// </summary>
        private void MenuSetting()
        {
            FrmMenuSetting dlg = new FrmMenuSetting();
            dlg.OnDataSaved += (s, arg) =>
            {
                //用户保存参数后,提示用户更新树形列表
                InitToolbar();
            };
            dlg.ShowDialog();
        }

诸如此类界面配置参数并保留后,界面包车型地铁树形菜单会立马获取更新处理。

别的,大家主界面包车型大巴树形列表,也要依据安插参数的音信作有关的调整,如若用户配置了不展现有些菜单,那么主界面也要根据配置参数控制展现。

XML 7

 

3、总结

上述正是总体菜单列表的动态性格化配置管理的总体思路和落实步骤代码,首要的界面考虑衡量依旧以用户的视觉来考虑界面包车型的士布局和效能,假如在几百个菜单项中找寻多少个常用的菜系,每正是三个相比耗费时间无聊的操作,由此提供多个本性化的界面,依照办事景况的例外,显示一些和融洽巢倾卵破的作用即可。

诸如有些情形下,大家的食谱呈现,希望经过工具栏的方法展开控制显示,如下界面效果所示。

XML 8

那正是说配置维护界面依然基本上,只是大家决定工具栏的体现逻辑有所不一致而已,对于RibbonPage及其成效菜单的动态变化处理如下所示。

XML 9

本篇小说首要如故盼望读者借鉴配置存款和储蓄和菜单天性化管理的思路,具体的逻辑会因用户界面包车型大巴差异,使用的控件差别而具有区别,可是全体思路是千篇一律的即可。

比如某些参数的布局管理,能够统一运用多个铺排管理界面进行爱惜,如作者前面包车型客车小说介绍的界面成效雷同。

XML 10

 希望本篇小说对你拥有启发,感激耐心阅读。

相关文章

网站地图xml地图