设计时支持扩展通常是在与组件代码不在一起的代码中实现的。许多属性都用于将设计时支持提供程序与一个类型或一个类型的单个成员关联
关联设计时支持属性
通过将
自定义属性浏览器行为属性
通过给属性浏览器应用
通过将
通过给属性应用
通过将
通过给属性或事件应用
自定义设计时序列化行为属性
通过给属性应用
通过将
有关常用设计时属性的更多信息,请参见组件的设计时特性。
应用特性
设计时属性应用于属性、事件和类,甚至应用于程序集。下面的代码示例说明了应用于类然后应用于属性和事件的属性。
// The attribute is the element in brackets, and the parameters in
// the attribute syntax are arguments of the constructor
// of the attribute class.
//
// Attributes applied at the class level.
[DefaultEvent("ValueChanged")]
[DefaultProperty("Number")]
public class MyControl : Control {
...
// Attribute applied to a property.
[DefaultValue(false)]
public new bool TabStop {...
}
// Attribute applied to a property.
[CategoryAttribute("Data")]
public int Number {...}
// Attribute applied to an event.
[Description("Raised when the Value displayed changes.")]
public event EventHandler ValueChanged;
}
根据约定,属性类称为 AttributeName 属性。System.ComponentModel 命名空间包含许多基属性类。
设计时属性与继承
从具有设计时属性的基组件派生组件或控件时,组件继承基类的设计时功能。如果基本功能足以满足需要,则不必再次应用属性。但是,可以重写相同类型的属性或将其它属性应用于派生的组件。下面的代码片段显示了一个自定义控件,该控件通过重写基类中应用的 BrowsableAttribute 属性,重写从 Control 继承的 Text 属性。
[Visual Basic]
Public Class MyControl
Inherits Control
' The base class has [Browsable(true)] applied to the Text property.
<Browsable(False)> _
Public Overrides Property [Text]() As String
...
End Property
...
End Class
[C#]
public class MyControl : Control {
// The base class has [Browsable(true)] applied to the Text property.
[Browsable(false)]
public override string Text {...}
...
}
应用类型转换器、UI 类型编辑器或设计器属性
要使设计时支持提供程序与类型或类型成员关联,请应用类声明或成员声明上面一行上的相应的属性类型。下面的代码示例说明了应用于类型的 TypeConverterAttribute。
[Visual Basic]
<TypeConverter(GetType(MyColorConverter)), _
Editor(GetType(MyColorEditor), GetType(UITypeEditor))> _
Structure MyColor
...
End Structure
[C#]
[ TypeConverter(typeof(MyColorConverter))]
[ Editor(typeof(MyColorEditor), typeof(UITypeEditor))]
struct MyColor {...}
如果属性的类型不具有与之关联的类型转换器或 UI 类型编辑器,或者您想要重写与属性的类型关联的默认类型转换器或 UI 类型编辑器,可以将属性应用于属性自身。若要将类型转换器与属性关联,请将 TypeConverterAttribute 应用于属性声明,如下面的代码示例所示。
[Visual Basic]
<TypeConverter(GetType(PointConverter))> _
Public Property MyLocation() As Point
...
End Property
[C#]
[ TypeConverter(typeof(PointConverter))]
public Point MyLocation {...}
若要使 UI 类型编辑器与属性关联,请将 EditorAttribute 应用于该属性,如下面的代码示例所示。
[Visual Basic]
<Editor(GetType(FlashTrackBarDarkenByEditor), _
GetType(UITypeEditor))> _
Public Property DarkenBy() As Byte
...
End Property
[C#]
[ Editor(typeof(FlashTrackBarDarkenByEditor), typeof(UITypeEditor))]
public byte DarkenBy {...}
设计器可以与类型关联,但不能与属性关联。要使设计器与某种类型关联,请在类声明上面一行应用 DesignerAttribute,如下面的代码示例所示。
[Visual Basic]
<Designer(GetType(HelpLabel.HelpLabelDesigner))> _
Public Class HelpLabel
Inherits System.Windows.Forms.Control
Implements System.ComponentModel.IExtenderProvider
...
End Class
[C#]
[Designer(typeof(HelpLabel.HelpLabelDesigner))]
public class HelpLabel : System.Windows.Forms.Control, System.ComponentModel.IExtenderProvider {...}
注意 以上示例中,TypeConverterAttribute、EditorAttribute 和 DesignerAttribute 类的构造函数采用 System.Type 对象作为参数。如果类型与设计时类位于同一程序集中,这些属性的这种形式的构造函数将有效。如果设计时类位于其他程序集中,则需要另一种形式的属性构造函数(称为程序集限定格式),如下面的代码示例所示。
[Visual Basic]
<Designer("System.Windows.Forms.Design.DocumentDesigner, System.Design")> _
Public Class MyForm
Inherits Form
...
End Class
[C#]
[Designer("System.Windows.Forms.Design.DocumentDesigner, System.Design")]
public class MyForm : Form {...}
程序集级别设计时属性
ASP.NET 提供了一个程序集级别属性 (System.Web.UI.TagPrefixAttribute),该属性使控件开发人员能够为 ASP.NET 控件指定标记前缀。在 Register 指令中,此标记前缀由 Visual Studio .NET 为控件自动插入,所以控件可以在页中以声明方式同预先指定的标记前缀 (<tagprefix:controlname ... runat = server /> ) 一同使用。
注意 TagPrefixAttribute 仅在可视化设计器中有效。如果使用“记事本”这样的文本编辑器创作 ASP.NET 页,则需要在 Register 指令中亲自为控件指定标记前缀和命名空间。
下面的代码示例说明如何应用 TagPrefixAttribute。属性构造函数的第一个参数指定命名空间,第二个参数指定标记前缀。
[Visual Basic]
<assembly: TagPrefix("SimpleControls", "simple")>
Namespace SimpleControls
<Designer("SimpleControl.Design.SimpleDesigner, SimpleControl")> _
Public Class SimpleControl
Inherits System.Web.UI.WebControls.WebControl
...
End Class
End Namespace
[C#]
[ assembly:TagPrefix("SimpleControls", "simple") ]
namespace SimpleControls {
[
Designer("SimpleControl.Design.SimpleDesigner, SimpleControl")
]
public class SimpleControl : System.Web.UI.WebControls.WebControl {...}
}