Microsoft .NET Framework 1.0提供了一个非常通用的设计时框架,但是没有提供任何实现代码来完成一个设计器,Visual Studio.NET实现了所有的复杂逻辑,要第三方去重新实现这个复杂的逻辑。.NET Framework 2.0引入了一组类能够用于设计器的实现。
![]() |
![]() Figure 2 |
![]() Figure 3 Designer Hosting |
host container使用designer loader持久化设计器状态,designer loader使用序列化机制序列化组件。
服务扩展
The .NET Framework设计时框架是可扩展,提供的服务可用于实现各式各样的设计器。一个服务是提供对象可通过类型进行查询,典型的是你定义了服务的抽象类和接口和服务的实现。你可以从service container中添加或者删除服务。IDesignerHost是设计器主要的host接口,是一个Service Container。服务是一个组件间可以共享的,正因如此,在创建和使用Service的时候必须遵循确定的规则。
Services不被保证的,无论何时通过GetService方法请求一个服务(Services),你一定要检查返回的是否是一个有效对象。并不是所有的服务在所有的平台上都是可用的,而且曾经可用的服务未来不可能是可得。因此你的代码应当被写的降低优雅型,通常籍由需要某种服务而丢失某些特性,以防万一一个服务也得不到。
如果你添加一个服务,记得在设计器的被disposed的时候移除它。设计器会时不时地创建和消毁,如果你没有去清除一个服务的话,旧的设计器就会遗留在内存中。
DesignSurface 和DesignSurfaceManager
.NET Framework 2.0引入了两个类DesignSurface 和DesignSurfaceManager.给设计器提供宿主以及给设计器提供服务。DesignSurface是使用者所感知的设计器,它是UI使用者操纵改变设计时特征,DesignSurface 可能被当作一个单独的设计者使用或者和DesignSurfaceManager结合使用为设计器应用程序提供多个DesignSurface。
DesignSurface提供好几个设计时服务,大多数服务都可以在服务容器中被覆盖,替换不可替换的服务是非法的,因为他们之间彼此仰赖.注意添加到Service Containe实现了接口IDisposabler的服务当DesignSurface 销毁的时候都会被销毁。
除了提供缺省的服务,DesignSurface也提供了IDictionaryService,此服务提供一个使用关联键设置、检索和查找对象的简单接口。不可能替换这些服务因为在每个站点上无法替换这些服务。
DesignSurfaceManager是设计器的容器,它提供通用的服务以处理在设计者,属性窗口和其他的全局对象之间的事件路由. 使用 DesignSurfaceManager 是可选择的, 但是如果你想需要有一组设计者窗口,推荐使用DesignSurfaceManager。
DesignSurfaceManager也提供了几个设计时服务(see Figure 5).。每一个都可以在Protected属性ServiceContainer(服务容器)中被覆盖。和DesignSurface一样,DesignSurfaceManager所有的 实现了接口IDisposabler的服务 当设计器应用程序销毁的时候都会被销毁。
IDesignerEventService 是一个特别地有用的服务. 当一个设计器变成活跃的时候 , 它允许一个设计器应用程序被通知到. IDesignerEventService 提供了一组设计器和全局对象的访问点, 例如属性窗口能够侦听到选择变化事件.
宿主form
为了示范一下宿主一个设计器是多么简单,我写了下面的简单代码来创建一个基本的Windows? Forms designer并显示它:
| // Create the DesignSurface and load it with a form DesignSurface ds = new DesignSurface(); ds.BeginLoad(typeof(Form)); // Get the View of the DesignSurface, host it in a form, and show it Control c = ds.View as Control; Form f = new Form(); c.Parent = f; c.Dock = DockStyle.Fill; f.Show(); |
在这一个代码片断中,我已经用Form方式装载 DesignSurface. 同样地,你能用拥有根设计器的任何组件装载 DesignSurface. 举例来说,你可以改为装载 UserControl 或一个组件。
![]() Figure 6 Hosting Windows Forms Designer 上一篇: .NET Framework中的无接触部署 下一篇: .NET Framework中的资源与本地化
查看所有评论(0 )
Copyright©2005-2008 51CTO.COM 版权所有
|