技术开发 频道

在MVC模式下的UI AOP用例


   • Editor:提供自定义用户接口,以此来编辑构件属性,并且有选择地在显示它的属性浏览器细胞里描绘一个属性值。无论什么时候,当一个与编辑相连接的属性准备改变时,可以通过属性浏览器访问它。编辑器样本就是System.Drawing.Design.FontEditor,当你点击类型System.Drawing.Font的属性下面的省略符号时,就可以显示此System.Drawing.Design.FontEditor(此省略符号在类型System.Drawing.Font的旁边),或者点击System.Drawing.Design.ColorEditor(此System.Drawing.Design.ColorEditor提供一个颜色选择对话框)。
你可能会注意到:它们是两个不同类型的编辑器:FontEditor作为模式对话框而出现(例如:在Windows Formss控件中),但是ColorEditor(在Windows 以及Web控件中)则显示为一个下曳的小玩意儿(像AnchorEditor一样,AnchorEditor也显示成一个下曳式的小玩意儿)

    • TypeConverter:这是目前为止最难分类,最难描绘的部分,因为它拥有几个功能。首先,它提供了一个广泛的方法集,其中许多方法都是虚拟的,用来转换对象到其它类型,或者把其它类型转换成对象。这个转换主要被属性浏览器运用,转换成对象的字符串表示法或者从对象的字符串表示法转换,而此对象的字符串表示法是用于展示属性值的。但是我们将看到可能应用其他转换,而且其它转换甚至会影响构件的代码序列化。

   它也可以为属性提供一个值的序列表,这个值的序列表也是以下曳模式而显示出来的。你可能想知道这个与“Converter”世界有什么关系,也许Editor中应该包含有这个功能。

    最后能过滤将出现在属性浏览器中的内容窗体。例如:想要过滤可编辑的属性(此可编辑的属性是建立在创建的自定义属性基础上的,而不是建立在默认BrowsableAttribute基础之上的)时,过滤内容窗体对此非常有帮助。这是一个高级案例,但是将注意到:通过ComponentDesigner(几乎所有设计器的基类型),也可以利用这个功能,同时也可以注意到,此功能不但允许过滤属性,也允许过滤事件。

   TypeConverter和Editor可以应用到一个个体特性中,或者直接应用到类型中。在上面的例子中,任何附带有此类型的一个属性的对象可以自动地将编辑器/转换器与它相连接。

    属性浏览器也会使用设计器的一些功能,例如:DesignerVerbs。我们将在后面讨论DesignerVerbs,以及举例说明每一个属性的样本和它们的使用。

根构件和设计器

   一些类型导致设计图面出现在我们drop其它构件的地方。一般来说,这种情况会出现在Web 窗体 (Page 类型)中, 一个 Windows Forms中,或者任何组件-继承类型。例如:你将注意到自定义类型或者ASP.NET特定控件中将不会出现这些情况。两个属性的结合使得集成开发环境能为类型提供一个设计图面。

   DesignerCategoryAttribute:属性的构造函数必须指定“Component” 类。
[System.ComponentModel.DesignerCategory("Component")]
  DesignerAttribute:必须传递带有基本设计器类型的超载,而且设计器必须执行IRootDesigner.
[System.ComponentModel.Designer(typeof(My根tDesigner), 
typeof(System.ComponentModel.Design.I根tDesigner)]
   IComponent接口执行最后一个属性。因此每一个直接或者间接执行这个接口的类型将有一个默认设计图面,双击构件类型时,如果此默认设计图面拥有正确的种类,我们可以看到这个默认设计图面。Component类型就是一个例子。

   在解决方案资源管理器中选择一个项目来编辑时,如果有正确的种类和根设计器,集成开发环境将示例根设计器,将设计图面显示给用户。它将创建构件的一个实例,使它称为设计器宿主的根组件。例如:在设计视图中,当拥有一些子构件的Web 窗体s页面被打开时,这就是对象之间的联系。



   下面的伪码显示了Page类型宣告以及引起这个行为的属性:
[Designer(typeof(Web窗体Designer), typeof(I根tDesigner))] 
public class Page
   WebFormsDesigner类型位于同一个文件夹的Microsoft.VSDesigner.dll程序集中,作为我们在前面提到的Microsoft.VisualStudio.dll。在其它事物之间的这个设计器是从System.ComponentModel.Design.ComponentDesigner继承来的,此设计器是大部分设计器的基本类型,而且也是IDesigner接口的默认实现。Windows Forms构件中也有类似的过程。
   IComponent包括下面的属性声明:

[Designer(typeof(ComponentDocumentDesigner), typeof(I根tDesigner)] 
[Designer(typeof(ComponentDesigner)]
public interface IComponent
   当构件是根构件时,第一个属性定义类型(此类型处理设计图面的显示)。当其它设计器被放到另一个构件内部时,例如:一个Web 窗体,其它设计器指定构件提供的行为。

   目前为止讨论到的程序结构有一个主要目标,那就是:通过提高设计时期经验,以此来提高程序员的生产力。这里有太多的功能不能一一探讨,但是在一篇具体的高度集成的应用程序文章中,而不是单独的例子中,我们就可以一一探讨这些问题。我们将执行一个MVC框架,此MVC框架允许Web 和Windows应用程序共享一个公共的代码基础,将可视的程序员/设计器从复杂的商业对象中分离出来。此结构框架将主要建立在非可视构件的基础之上,但是我们实现的大部分集成开发环境集成功能是可视化控件的对等物。

0
相关文章