zoukankan      html  css  js  c++  java
  • RFID会议签到系统总结(十六)――菜单与工具栏按钮的改造(上)

     

    从这一篇开始要讲管控端是如何来加载菜单与工具栏的了,.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模式”有时也不是我们通常的那种写法。

  • 相关阅读:
    Hadoop2.0 HA集群搭建步骤
    了解何为DML、DDL、DCL
    搭建Hadoop平台(新手入门)
    周记1
    IT小小鸟
    Python中的函数修饰符
    python_类方法和静态方法
    Python的log模块日志写两遍的问题
    python——装饰器例子一个
    初识HIVE
  • 原文地址:https://www.cnblogs.com/lichdr/p/822023.html
Copyright © 2011-2022 走看看