C# 基于插件的开发框架实现Ribbon界面与功能的分离附DEMO
2013-01-11 21:57
1086 查看
![](http://img.my.csdn.net/uploads/201301/11/1357906998_2197.png)
![](http://img.my.csdn.net/uploads/201301/11/1357906647_2803.png)
以前写过一篇文章是实现界面与功能的分离,基于插件的方式,要实现一个功能需要实现一个类,该类继承于: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
相关文章推荐
- C# 优化基于插件的开发框架实现Ribbon界面与功能的分离附DEMO
- C#实现界面与功能的分离:Ribbon界面
- iOS开发之旅(2):实现一个APP界面框架之搜索功能
- 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)
- 基于.Net(C#开发)平台的三层框架架构软件的设计与实现
- Winform开发框架之参数配置管理功能实现-基于SettingsProvider.net的构建
- 基于WPF系统框架设计(5)-Ribbon整合Avalondock 2.0实现多文档界面设计(二)
- 基于.Net(C#开发)平台的三层框架架构软件的设计与实现
- 基于Metronic的Bootstrap开发框架经验总结(8)--框架功能总体界面介绍
- 基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
- 基于C#语言开发的IM系统--界面赏析(通讯框架为networkcomms2.3.1)【即将开源】
- Android开发之基于MINA框架的聊天通信功能实现
- 基于Metronic的Bootstrap开发框架经验总结(8)--框架功能总体界面介绍
- dui框架开发系列:基于控件组合或继承实现 可视化界面编辑工具 的优劣
- (转)基于MVC4+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
- 基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现
- 基于Metronic的Bootstrap开发框架经验总结(8)--框架功能总体界面介绍
- 基于MVC+EasyUI的Web开发框架经验总结(10)--在Web界面上实现数据的导入和导出
- [Java]Openfire插件开发心得:基于XMPP实现类Twitter功能
- 基于Metronic的Bootstrap开发框架经验总结(16)-- 使用插件bootstrap-table实现表格记录的查询、分页、排序等处理