用.NET2.0创建自定义设计器笔记

最近因项目需要,需要开发自己的设计器,相当于设计出一个IDE出来。乍看一下很困难,幸运的是.NET Framework 2.0为我们提供了一套设计器体系结构,并引入了一组类和服务,使我们可以很方便的开发出一个可扩展的设计器出来。
  该设计器体系核心思想是,提供一个宿主容器,并将其绑定到一组设计器上,并为之提供服务。任何一个设计器对象都连接一个运行时存在的对象,.NET Framework2.0提供两个类用于宿主设计器:DesignSurface 和 DesignSurfaceManager。DesignSurface可以看作是一个单独的设计器,实际上当你创建一个DesignSurface对象,就会产生一个宿主容器,你可以创建组件,并把他们绑定到设计器上,并可以对他们提供服务。这时你需要提供一个根组件,通常我们使用Form,或者UserControl、PictureBox等等,它相当于一个可视的设计器外壳,我们将其组件与设计器绑定,通过其View属性呈现给用户,之后你可以利用宿主设计器提供的服务在其上添加任意组件,就像开发一个Winform程序那样。DesignSurfaceManager可以宿主多个DesignSurface,并为之提供服务,你可以把它看作设计器的容器,当需要建立多个宿主设计器的时候需要使用它。宿主容器的另一个大功能是提供一个设计加载器,它是从DesignerLoader类继承,你可以通过它加载某些持久性设计资源,例如XML、CS代码,例如从已序列化好的xml文件中加载到设计器中,并呈现出它之前的状态,当然也提供序列化和反序列化功能。
  设计器的另一个核心是服务,当你开发设计器时你会发现,任何的功能都离不开服务,它是可扩展的基础,DesignSurface默认会提供一些基础服务,这些服务是用户不可替换的,用户也可以根据需求自己添加一些服务。IDesignerHost是一个比较重要的服务,它是用于提供设计器和对类型、服务和事务进行访问的主要接口。它是设计器最基础类型的接口,例如要获取根组件的对象就需要使用此接口。例如你要添加服务方法为:this.AddService(typeof(IMenuCommandService), new MenuCommandService(this));此方法添加一个IMenuCommandService服务;请求服务的方法为:
IDesignerHost host = (IDesignerHost)this.GetService(typeof(IDesignerHost));由此我们可以想象,如果你要开发一个类似于VS的集成开发环境,需要一个设计器视图、工具箱组件、状态窗口、属性窗口、树形解决方案浏览器等等,我们可以分别把他们作为服务,加到统一的宿主设计器中来,这便是一个IDE。
  综上所述,我们可以总结出开发一个最基本设计器的步骤:
  需要实例化DesignSurface对象,获得一个宿主设计器;
  如果不需要从持久性状态资源中创建根组件,则可以调用BeginLoad方法,否则需要实
  例化设计加载器(例如BasicDesignerLoader),调用CreateComponent方法;
  获取该组件的View属性呈现给用户;
  将根组件绑定到设计器。
  大体代码可以总结如下:
  DesignSurface surface = new DesignSurface();
  surface.BeginLoad(typeof(Form));
  Control c = ds.View as Control;
  Form f = new Form();
  c.Parent = f;
  c.Dock = DockStyle.Fill;
  f.Show();
相关资源可参考:
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值