在WinForms项目里面做菜单、工具栏还有业务入口的时候,操作者经常会碰到DevExpress Ribbon菜单要怎么去创建,还有Ribbon按钮的事件不触发了又要怎么办这样的问题。DevExpress里面的RibbonControl这个控件,它是专门被拿来去创建那种很像Office风格的Ribbon工具栏的,能够把命令按分类、页面,还有分组这么一层一层地给组织起来。官方文档里头也讲到,RibbonControl会把命令组织到category、page和page group里面去,所以创建Ribbon的时候,并不是只把一个按钮拖到界面上就算好了,还得把RibbonControl、RibbonPage、RibbonPageGroup和BarButtonItem这几样东西之间的关系给理理顺。
一、DevExpress Ribbon菜单怎么创建
在动手去创建Ribbon菜单之前,操作者得先把这个菜单的层级给搞清楚,一般来说RibbonControl是最外面那层容器,RibbonPage就相当于一个页签,RibbonPageGroup是页签里面的分组,像BarButtonItem这样的按钮再被放到分组里头去,层级要是没弄明白,最常看见的问题就是按钮明明已经建好了,界面上却怎么都显示不出来。
1、先把Ribbon控件给加到窗体上
操作者要在窗体上面先放好一个【RibbonControl】,然后再照着业务模块去把不同的RibbonPage建出来,比如系统管理、数据维护、报表中心、工具设置这些,这么做是要避免把全部的按钮都挤在同一个页签里面,Ribbon这个东西更适合按照业务场景来分组,而不是把传统的菜单直接搬过来,分组被弄清楚了之后,用户才更容易找到对应的功能。
2、把页面和分组给建好
每一个RibbonPage的下边都可以加上好几个RibbonPageGroup,文档里面也说明了,RibbonPageGroup它表示的是RibbonPage里面的一个组,组里头的命令是通过ItemLinks属性给添加进去的,就拿“文件”这个页签来说,下面可以把它分成新建、打开、保存、导出这么几个组,这样去弄要比把按钮简单横着排成一排清楚得多。
3、把按钮和图标给添上去
创建好BarButtonItem以后,要把它给加到RibbonControl的Items集合里面,再通过分组的ItemLinks把它显示出来,官方文档也提过醒,如果BarItem是在代码里面创建出来的,那就要动手把它加到RibbonControl.Items这个集合里面,或者用那种会自动把它加进集合的创建方式,要是只new了一个按钮对象出来,却没有加进集合,也没有添加到分组里面,界面上一般就是看不到它的。
二、DevExpress Ribbon按钮事件不触发怎么办
Ribbon按钮的事件不触发的时候,操作者不要光去查那个方法里面写了代码没有,更常见的原因是事件它根本就没绑上去、按钮不是当前显示出来的那个实例、按钮被禁用掉了,或者被点中的地方是下拉区域而不是普通按钮区域,这些情况都得一个一个去排查。
1、检查事件被绑在哪个位置
先要确认【ItemClick事件】是不是被绑到了那个正确的BarButtonItem上面。
文档里面讲过,代表按钮的bar item link被点击的时候,会把BarItem.ItemPress和BarItem.ItemClick这两个事件给触发出来,ItemClick是发生在鼠标松开之后的,要是想集中管理,也可以去订阅RibbonControl自己的ItemClick事件,如果代码里面重新去new了一个按钮,却把事件绑在了旧的对象上头,那界面上的按钮被点击的时候,当然就不会进到事件里面去。
2、检查按钮到底能不能被点动
如果按钮的Enabled被设成了false,可见性被控制住了,或者它待着的那个Page和Group根本就没有正常显示出来,那用户去点它的时候就不会把预想的逻辑给触发出来,有些项目会在初始化权限的时候动态地把按钮禁掉,开发调试的时候就很容易只盯着设计器看,不去管运行时的权限状态。
3、把普通按钮和下拉按钮给区分开
要是用了DropDownButton、BarSubItem或是那种带弹出菜单的按钮,点击的区域不一样,触发出来的事件也可能不一样,有的时候去点那个下拉的小箭头,就只是把菜单展开,并不会去跑主按钮的逻辑,这个时候就要搞明白,业务代码是该绑在主按钮的ItemClick上面,还是该绑在下拉菜单的那些子项上面。
三、Ribbon菜单调试时还要注意什么
Ribbon这边出的问题,看起来好多都像是界面上的毛病,可实际上它经常跟动态加载、权限控制、MDI合并还有模块化窗体这些事情搅在一起,特别是那种大型的WinForms项目,按钮可能不是靠设计器固定生成出来的,而是在运行的时候根据用户角色或者模块配置,动态去创建的。
1、确认运行时对象是不是同一个
如果菜单是动态生成的,那就要在按钮被创建出来以后马上去把事件绑好,并且把按钮的实例给保留住,不要在不同的方法里面反复去创建名字相同的按钮,不然的话界面上显示的是一个对象,事件绑着的又是另一个对象,排查起来会非常绕。
2、检查Ribbon合并的场景
在MDI子窗体或者模块窗体里面去用Ribbon的时候,可能会把父窗体的Ribbon和子窗体的Ribbon合到一起去,碰到按钮能显示出来但事件却不对的情况,就要查一下当前被点中的那个按钮,到底是父窗体上的,还是合并之后的子窗体上的,合并场景下最好是把按钮的命名和事件绑定的位置统一管起来。
3、把菜单初始化的记录给留下来
比较建议去整理一份【Ribbon初始化代码】,把Page、Group、Button、权限控制还有事件绑定这些内容放在一个清晰的地方,不要把按钮的创建、权限的判断和业务的逻辑分散到一大堆零零碎碎的方法里面去,不然到了后面想新增菜单,或者排查事件为什么不触发的时候,就很难定到位。
总结
DevExpress Ribbon菜单怎么创建,还有Ribbon按钮事件不触发怎么办,这里面顶要紧的事情,就是先得把RibbonControl、RibbonPage、RibbonPageGroup和BarButtonItem这几层关系给理清楚了,按钮被创建出来以后,要确定它已经加到Items集合里面,而且通过ItemLinks显示到了正确的分组里头,事件不触发的时候,要查ItemClick的绑定、按钮的实例、Enabled的状态、下拉按钮的类型,还有Ribbon合并的场景,只要把菜单的结构和事件的绑定写得明明白白,DevExpress Ribbon到了后期维护起来,是会稳当很多的。
