C# 优化基于插件的开发框架实现Ribbon界面与功能的分离附DEMO

以前写过一篇文章是实现界面与功能的分离,基于插件的方式,要实现一个功能需要实现一个类,该类继承于:AbstractToolButtonCommand,而AbstractToolButtonCommand又继承于:DevExpress.XtraBars.BarButtonItem类,这样在覆写父类的一些属性和方法的时候,VS的提示功能会列出很多属性,不方便开发,本次对整个结构进行了调整。AbstractToolButtonCommand类只实现了一些必要的接口如:

  public abstract class AbstractToolButtonCommand : AbstractCommand, IMenuCommand, ICommand
    {
        private bool isEnabled = true;
        private bool isVisible = true;

        protected AbstractToolButtonCommand()
        {
        }

        public virtual string GroupName { get; set; }
        public virtual string PageName { get; set; }
        private string caption = "按钮";
        public virtual string Caption
        {
            get { return this.caption; }
            set { this.caption = value; }
        }

        public virtual Image smallImage { get; set; }
        public virtual Image largeImage { get; set; }


        public virtual bool IsEnabled
        {
            get
            {
                return this.isEnabled;
            }
            set
            {
                this.isEnabled = value;
            }
        }

        public virtual bool IsVisible
        {
            get
            {
                return this.isVisible;
            }
            set
            {
                this.isVisible = value;
            }
        }
    }

我们要实现一个功能则只需要定义一个类继承于AbstractToolButtonCommand类且实现相应的属性和Run函数即可。这样在主窗口上就会自动加载一按钮,点击该按钮执行相应的功能。将该类编译成一个独立的DLL,放置于主程序的相同目录中,会自动将其反射出来加载:

 public class AddOneSec : td.Core.AbstractToolButtonCommand
    {
        public override void Run()
        {
            var t = td.Core.WorkBenchSingleTon.WorkBench.GetActivteTabPage();
            if (t is td.Core.ViewContent)
            {
                {
                    var control = (userControl)t.ViewContentControl;
                    ((userControl)control).txtBox.Text = DateTime.Now.ToString();//设置主窗口中TextBox的值
                }
            }
        }
        public override string PageName  //Ribbon界面中页面的名字
        {
            get
            {
                return "Home";
            }
            set
            {
                base.PageName = value;
            }
        }
        public override Image smallImage  //设置图标
        {
            get
            {
                try
                {
                    return Image.FromFile(Application.StartupPath+"\\images\\Drafts_16x16.png");
                }
                catch (Exception ee)
                {
                    return null;
                }
            }
            set
            {
                base.smallImage = value;
            }
        }
        public override System.Drawing.Image largeImage
        {
            get
            {
                try
                {
                    return Image.FromFile(Application.StartupPath + "\\images\\Drafts_16x16.png");
                }
                catch (Exception ee)
                {
                    return null;
                }
            }
            set
            {
                base.largeImage = value;
            }
        }
        public override bool IsEnabled   //按钮是否有效,这个可以用于权限的判断,只要在这里设置好条件的判断,系统会自动更新按钮的状态。在这里我是判断C:\1.TXT是否存在,如果在运行过程中删除了该文件,则按钮会自动变成灰色。
        {
            get
            {
                return File.Exists("c:\\1.txt");
            }
            set
            {
                base.IsEnabled = value;
            }
        }
        public override string GroupName   //组名称
        {
            get
            {
                return "--ok";
            }
            set
            {
                base.GroupName = value;
            }
        }
        public override string Caption    //按钮标题
        {
            get
            {
                return "增加1秒";
            }
            set
            {
                base.Caption = value;
            }
        }
    }

在上 一篇博客中我据介绍了singleton模式,在这里就用到了,主界面使用singleton模式,保证只有一个实例,而且在整个软件任何地方我都可以通过singleton所提供的workbench属性访问到主窗口中的属性(当然要访问到主窗口中的控件,需要将控件设置成public )。

在本例中Run函数首先通过workbench所提供的GetActivteTabPage函数获取当前的页面,然后转换成对应的User控件,然后更改该控件上的textbox的值,(为了方便将页面上所有的控件做成了一个用户控件,这样在VIEW中就只需要处理一个UserControl了,这样就避免将所有的控件的操作放到workbench中,而是分解到了各自的模块上。)

 public override void Run()
        {
            var t = td.Core.WorkBenchSingleTon.WorkBench.GetActivteTabPage();
            if (t is td.Core.ViewContent)
            {
                {
                    var control = (userControl)t.ViewContentControl;
                    ((userControl)control).txtBox.Text = DateTime.Now.ToString();
                }
            }
        }

 

DEMO下载地址:http://download.csdn.net/detail/happyw2004/4986552

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值