惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

GbyAI
GbyAI
博客园 - 三生石上(FineUI控件)
S
Securelist
U
Unit 42
The Cloudflare Blog
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Simon Willison's Weblog
Simon Willison's Weblog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
B
Blog
T
Tenable Blog
The Hacker News
The Hacker News
The Register - Security
The Register - Security
IT之家
IT之家
博客园 - 【当耐特】
Spread Privacy
Spread Privacy
P
Privacy & Cybersecurity Law Blog
博客园_首页
T
Tailwind CSS Blog
人人都是产品经理
人人都是产品经理
C
Cybersecurity and Infrastructure Security Agency CISA
Know Your Adversary
Know Your Adversary
NISL@THU
NISL@THU
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
阮一峰的网络日志
阮一峰的网络日志
T
Tor Project blog
C
CERT Recently Published Vulnerability Notes
Apple Machine Learning Research
Apple Machine Learning Research
Stack Overflow Blog
Stack Overflow Blog
T
Threat Research - Cisco Blogs
T
The Exploit Database - CXSecurity.com
V
Vulnerabilities – Threatpost
A
Arctic Wolf
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
V
V2EX
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
Scott Helme
Scott Helme
L
LINUX DO - 热门话题
Cyberwarzone
Cyberwarzone
V
Visual Studio Blog
月光博客
月光博客
爱范儿
爱范儿
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
美团技术团队
G
GRAHAM CLULEY
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Heimdal Security Blog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO

博客园 - lichdr

高德地图热力图的Flutter实现 App消息推送的简单实现 nginx访问日志过滤(多条件) CAS的service参数验证 自定义Token的CAS登录 单元格的计算 表格行列的删除 表格行列的移动 FastReport的一些另类用法 FastReport分组页码 RFID会议签到系统总结(二十二)――系统中的模式 RFID会议签到系统总结(二十一)――服务端的通讯 RFID会议签到系统总结(二十)――数据窗体状态控制 RFID会议签到系统总结(十九)――单数据窗体 RFID会议签到系统总结(十八)――菜单与工具栏的加载 RFID会议签到系统总结(十七)――菜单与工具栏的改造(下) RFID会议签到系统总结(十五)――管控端的窗体组织 RFID会议签到系统总结(十四)――管控端业务模块的加载 RFID会议签到系统总结(十三)――模块概述(下)
RFID会议签到系统总结(十六)――菜单与工具栏按钮的改造(上)
lichdr · 2007-07-18 · via 博客园 - lichdr

从这一篇开始要讲管控端是如何来加载菜单与工具栏的了,.Net Framework自带的菜单与工具栏用来做一个简单的小程序是大大胜任的。但用它们来实现一个可以称之为系统的东西则不够强大,变化多端的环境转瞬间就使它们的功能是捉襟见肘了,这里我们必须先要对它们做出一定的改造。

菜单与工具栏只是UI的二种不同表现,二者在系统的动作执行上是没有什么不同的。由此说起二者的系统集成,一般都会提到Command这个设计模式,我这里当然也逃不出那个模子。

.Net里没有如Delphi那样提供有一个TCustomAction之类的东西,那只有自己定义一个接口:

    public interface ICommand

    {

       string ID { get;set;}

       void Execute();

    }

简单点,什么UndoEnabled都不用了,只有一个Execute这么一个动作及一个标识。

为了把动作与具体的UI元素分离,再定义一个接口:

    public interface ICommandHolder

    {

       ICommand GetCommand();

       void SetCommand(ICommand cmd);

    }

其实就是一个属性,以后只要我们的菜单(或按钮)类实现了ICommandHolder这个接口,那就可以了。

下面来提取我们这个系统中需要的Command。在这个系统中动作主要有二类,一是执行动作后调出一个新的窗体,二是执行动作后并没有新窗体出现(可能会改变当前UI的某些元素。对于这二类动作,其Execute方法是不同的,所以这里分为二个类来实现不同的动作。

对于显示窗体的Command

显示窗体的Command

反射无处不在。而对于没有新窗体出现的Command,原理也是差不多的,只是构造出相应类型后,执行相关的动作。

    Type frmType = Type.GetType(formType);

    //执行命令的类要实现singleton模式

    object objFrm = frmType.InvokeMember("getInstance",

                  BindingFlags.Static | BindingFlags.Public | BindingFlags.InvokeMethod,null,null,new object[] {owner});

    if (methodName.Length > 0)

    {

       frmType.InvokeMember(methodName,

                     BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance,null,objFrm,null);

    }

由于对于相似的一组命令执行类,它们之间类成员没有什么异同,所以它们之间共享同一实例,这里注释上写“要实现singleton模式”,其实到具体实现时由于环境的特殊关系,这个“singleton模式”有时也不是我们通常的那种写法。