应用程序开发总结(2)---菜单

下面两章是针对菜单设计的,总的来说,

1)菜单的管理并不需要特殊的工具,它不需要不停的修改。

2)对菜单的样式的转换是最简单的菜单管理,不仅维护了的菜单的本来含义,而且很好的做到访问隔离和样式定制。


第三章   菜单的含义

我们公司有一套菜单配置工具。通过这个工具,可以较为灵活的,通过插件的方式来配置菜单。这套工具原来做的是WinForm的菜单的配置,后来改为对Qios.DevSuite的配置。

这套工具的原理是在程序启动的时候动态编译一个xml文件,类似于C#的.Designer.cs文件。然后将每个菜单项链接到一个动态库的功能项中。一旦菜单被点击,就触发功能项的入口函数。

这套工具修改菜单后,是不需要重新编译程序。它实现了界面设计和功能分开来。


我一直不喜欢这个工具,有下面几个方面的原因:

1)每个菜单项对应一个dll。所以有多少个菜单项,就有多少个dll。这是很庞大的,即使一个dll中对应多个功能类,菜单的配置人员都需要了解这些dll的内在含义(假如一个功能项的名称写成MeasureDistanceOfGoldBirdge,你是会怀疑我的英语水平还是怀疑我的表达能力呢)

2)由于是插件式的功能项,可以想象,任何一个功能项是很难和其他功能项协作的。

3)再完美的菜单配置的工具,总是基于原有界面设计(比如CSharp窗口编辑器)的框架做二次开发。所有有些功能很难超越原有的界面设计。比如我有两个相同功能的按钮,当一个按钮按下去后,启动Checked,那么另外一个也应该设置为Checked。但自己设计的菜单配置工具就可能不提供。

最后一个我认为很严重的错误,就是对应用程序的理解。应用程序不像网页,需要不断的调整样式,网页需要好的效果来吸引用户。而应用程序的目的是提供功能。它的主要目标不在界面上,而是功能的协调。我希望的只是点击一个按钮后能进入相关的操作状态。同时,应用程序的界面风格一般比较固定,一个版本或者多个连续的版本你基本看不到界面的差异。


第四章    菜单集成

假如一个已经设计好的类库,它包含了并对外公开一个ToolBar或者Menu来表示它的功能菜单。那么如何进行界面集成呢?

这时候我们可以写一个转换的类,将这个类库管理的菜单进行转换成主框架支持的菜单样式。

下面以一个示例,说明这种转换:

  当前主系统是基于Qios.DevSuite做的菜单,如下图所示


另外一个插件(类库)维护的是一个ToolBar。它的功能项如下


这个插件的对外功能不对主提供公开,唯一公开的是这个ToolBar。它自己维护这个菜单,主框架只知道存在这个ToolBar,但是每个按钮做了什么事情是不知道的。

其实要做的事情很明了了,就是将ToolBar的每一项映射为主系统的Qios.DevSuite的菜单。

下面给出几个映射的方法:

sb.AppendLine("ToolStripSeparator转换为QRibbonPanel");
            sb.AppendLine("ToolStripSeparator.Tag            是   QRibbonPanel.Title");
            sb.AppendLine("----------------------------------------------------------------------------------");
            sb.AppendLine("ToolStripButton转换为QRibbonItem,");
            sb.AppendLine("ToolStripButton.BackgroundImage   是   QRibbonItem.Icon");
            sb.AppendLine("ToolStripButton.Text              是   QRibbonItem.Title");
            sb.AppendLine("支持Enable,Checked,Click事件");
            sb.AppendLine("----------------------------------------------------------------------------------");
            sb.AppendLine("ToolStripSplitButton转换为QRibbonItem");
            sb.AppendLine("同ToolStripButton,但不支持Checked事件");
            sb.AppendLine("----------------------------------------------------------------------------------");
            sb.AppendLine("ToolStripSplitButton.DropDownItems转换为QCompositeMenuItem");
            sb.AppendLine("ToolStripItem.Image              是    QCompositeMenuItem.Icon");
            sb.AppendLine("ToolStripItem.Text               是    QCompositeMenuItem.Title");

-----

如此,插件如何设计菜单,是插件的事情,也不需要进行统一配置。不仅减少了对菜单的管理,而且只有修改转换器,那么无论将来主系统使用菜单的效果,还是ToolBar的效果,或者是Qios.DevSuite的效果,插件的菜单都是不需要修改的。外界对插件如何设计的,是如何协调的,也将变的透明。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值