打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
.NET创建宿主设计器--DesignHost、DesignSurface.

一个窗口在运行时,是这样的:


 
但是,在设计时,却远比这复杂的多,它需要一个设计器对象:它进存在于设计时,并连接到运行时存在的对象。

宿主容器

我们可以看到每个窗体和按钮均有与子相关的设计器。这两个对象也连接到拥有这两个对象的宿主容器。宿主容器还提供以下服务:选择服务(选择界面上的控件)、显示消息的UI服务、调用帮助、与开发环境交互等。

另外,宿主容器还承担许多职责。它创建组件,将它们绑定到设计器,并为其维护的组件和设计器提供服务。它从某种持久性状态加载设计器,并将它们保存回该状态。宿主容器提供撤销逻辑、剪贴板功能、以及其他服务 — 设计器需要以其为基础来提供一个健壮的设计时环境

利用服务提高可扩展性

  .NET Framework 设计器体系结构是可扩展的。可扩展性的关键在于,服务能够增强各种设计器的可用功能。

服务是一种对象,可根据类型进行查询。通常,您定义一些代表服务的抽象类或接口,然后提供对该服务的实现。您可以将服务添加到调用服务容器的对象,也可以从该对象中删除服务。

IDesignerHost — 设计器的主要宿主接口,它是一个服务容器。服务是一种功能,可在由不同方编写的组件之间进行共享。因为这个原因,您必须在使用和创建服务时沿袭某些规则。

DesignSurface DesignSurfaceManager

.NET Framework 2.0 引入两个类,用于宿主设计器并为设计器提供服务DesignSurface 和 DesignSurfaceManagerDesignSurface 是用户眼中的设计器;它是用户进行操作以更改设计时功能的 UIDesignSurface 可作为一个单独的设计器使用,或者可与 DesignSurfaceManager 联合使用以提供宿主多个 DesignSurfaces 的应用程序的一个公共实现。

DesignSurface 自动提供一些设计时服务(参见MSDN。其中的大部分服务可在服务容器中重写。替换不可替换的服务是非法的,原因是这些服务的实现均相互依赖。注意,添加到服务容器中(实现 IDisposable)的所有服务将在处置设计表面时进行处置。

DesignSurfaceManager 旨在成为设计器的容器。它提供常规服务,用于处理设计器、属性窗口和其他全局对象之间的事件路由。DesignSurfaceManager 的使用是可选的,但建议在有若干设计器窗口的情况下使用它。

一个DesignSurface 的例子

// 创建一个Form的设计面

DesignSurface ds = new DesignSurface();

ds.BeginLoad(typeof(Form));

//获得这个设计面的试图,并在一个窗体中显示出来

Control c = ds.View as Control;

Form f = new Form();

c.Parent = f;

c.Dock = DockStyle.Fill;

f.Show();

同样,您也能够利用任意具有可用根设计器的组件加载 DesignSurface。例如,可以加载一个 UserControl 或一个 Component 

IDesignerHost (设计宿主)

由 DesignSurface 提供的一个主要服务是 IDesignerHost。它是用于提供设计器和对类型、服务和事务进行访问的主要接口。它还可用于创建和销毁组件。要向我之前已创建的 Windows 窗体设计器添加一个按钮,只需从 DesignSurface 获得 IDesignerHost,然后用它创建如图 7 所示的按钮。 

IDesignerHost idh = (IDesignerHost)ds.GetService(typeof(IDesignerHost));

Button b = (Button)idh.CreateComponent(typeof(Button));// 创建组件

// Set the Parent of this Button to the RootComponent (the Form)

b.Parent = (Form)idh.RootComponent;

工具箱

  工具箱需要实现 IToolboxService — 该服务添加到服务容器,并且可由任何需要使用它的用户访问。 

DesignerLoader(设计器加载器)

  持久保持设计器设计器加载器用于从某些持久状态载入设计器 

除了加载窗体设计,设计器加载器还可以保存设计。因为保存是可选操作,所以设计器加载器要进行侦听以改变设计器宿主的事件,然后自动保存与这些事件相关的状态。 

.NET Framework 2.0 引入两个新类,用于编写自定义的加载器:BasicDesignerLoader 和 CodeDomDesignerLoader1.上面,我们已经演示过通过传递组件的类型来加载 DesignSurface 的根组件2.然而,如果您使用加载器,则它可用于加载设计表面。当使用加载器时,将使用如下所示的 BeginLoad 代码片断

// Load it using a Loader

ds.BeginLoad(new MyLoader());

DesignerLoader 用于加载 DesignSurface 中的根组件,以及创建任意组件。创建一个新窗体或任意其他根组件时,只载入加载器。对比一下,当从代码文件或其他存储进行加载时,加载器用于分析文件或存储,重新创建根组件以及任何其他需要的组件

.NET Framework 定义一个名为 DesignerLoader 的抽象基类,它用于加载和保存持久存储的设计器。该基类是抽象的,因此可使用任意类型的持久性模型。然而,它也增加了该类实现的复杂性。

BasicDesignerLoade

CodeDomDesignerLoader

BasicDesignerLoader 提供一个完整且通用的设计器加载器实现,但不包括与持久性格式相关的信息。象 DesignerLoader 一样,它是抽象的,不表示任意有关持久性格式的信息。然而,BasicDesignerLoader 所作的就是处理一些标准工作,如了解何时进行保存,了解如何重新加载,以及跟踪设计器的更改通知。它的功能还包括,支持多个加载依赖项,跟踪修改过的位以指示需要保存变更,延缓重新加载支持的空闲时间。

.NET Framework 定义一个名为代码文档对象模型(Code Document Object ModelCodeDOM)的对象模型。所有源代码基本上均可拆分为基元元素,并且 CodeDOM 是这些元素的一个对象模型。当代码符合 CodeDOM 时,生成的对象模型可以稍后发送到特殊语言的代码生成器,以呈现适当的代码。 

尤其强大的是,我们可以将一个窗体保存为xml(使用BasicDesignerLoader加载器),这样可以在设计窗体后反序列化。 

本文的参考信息:

http://www.microsoft.com/china/MSDN/library/netFramework/netframework/DesignerHosting.mspx?mfr=true 

源码:

DesignerHosting

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用.NET Framework 2.0创建Form设计器
智能客户端一些摘抄
delphi Tstrings TCollection类
Tomcat 架构原理解析到架构设计借鉴
Delphi融合DLL中的窗体
.NET Framework 概述
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服