屬性和設計階段支援
更新:2007 年 11 月
設計階段支援擴充部分通常是在元件程式碼以外的程式碼中實作。它會使用各種屬性,讓設計階段支援提供者與型別或型別的個別成員產生關聯。
與設計階段支援產生關聯的屬性
DesignerAttribute 能讓型別與設計工具產生關聯。TypeConverterAttribute 能讓型別轉換子與型別或型別成員產生關聯。EditorAttribute 能讓 UI 型別編輯器與型別或型別成員產生關聯。
自訂元件初始設定的屬性
您可以將 DefaultValueAttribute 套用至屬性,以指定在設計階段載入元件時設定的屬性預設值。DefaultValueAttribute 會在設計階段覆寫元件初始化程式碼所設定的值,但此屬性不會覆寫設計工具所設定的值。
自訂屬性 (Property) 視窗行為的屬性 (Attribute)
您可以將 BrowsableAttribute 套用至 [屬性] 視窗,以指示是否應該在視窗中列出屬性或事件。您也可以使用實作 IDesignerFilter 介面的設計工具,在設計階段修改公開至 [屬性] 視窗的屬性和事件集。您可以將 CategoryAttribute 套用至屬性或事件,以指定屬性或事件應該列入 [屬性] 視窗中的分類。您可以將 DescriptionAttribute 套用至屬性或事件,以指定 [屬性] 視窗中屬性或事件所要顯示的說明。
您可以將 DesignOnlyAttribute 套用至屬性,以指定屬性是否只能在設計階段設定。您可以將 ReadOnlyAttribute 套用至屬性,以指定屬性在設計階段是唯讀或讀取/寫入。
您可以將 ParenthesizePropertyNameAttribute 套用至值為 true 的屬性,以指定是否應該在 [屬性] 視窗中以括弧括住名稱列出屬性。
您可以將 NotifyParentPropertyAttribute 套用至會引發告知的巢狀屬性,以指定是否要在巢狀屬性值變更時告知有巢狀或子屬性的屬性。
您可以將具有適當 RefreshProperties 值的 RefreshPropertiesAttribute 套用至屬性或事件,以指定是否應該重新整理元件的屬性、不重新整理任何屬性,或重新繪製設計工具檢視。
自訂設計階段序列化行為的屬性
您可以將具有適當 DesignerSerializationVisibility 列舉值的 DesignerSerializationVisibilityAttribute 套用至屬性,指定屬性值是否已序列化,或集合屬性值是否已序列化。Visual Studio 中對此工作有相當廣泛的支援。
您可以透過將 SerializableAttribute 套用至型別,指定型別可序列化。您可以透過實作 ISerializable 介面或提供自訂序列化程式,以提供自訂序列化。如需序列化的詳細資訊,請參閱序列化。
如需有關常用設計階段屬性的詳細資訊,請參閱元件的設計階段屬性。
套用屬性
設計階段屬性可套用於屬性、事件、類別,甚至組件。下列範例示範將屬性 (Attribute) 套用於類別,然後套用於屬性 (Property) 和事件。
' The attribute is the element in angle 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
Inherits Control
...
' Attribute applied to a property.
<DefaultValue(False)> _
Public Shadows ReadOnly Property TabStop() As Boolean
...
End Property
' Attribute applied to a property.
<CategoryAttribute("Data")> _
Public ReadOnly Property Number() As Integer
...
End Property
' Attribute applied to an event.
<Description("Raised when the Value displayed changes.")> _
Public Event ValueChanged As EventHandler
...
End Class
// 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;
}
依照慣例,屬性類別命名為 AttributeNameAttribute。System.ComponentModel 命名空間包含許多基底屬性類別。
設計階段屬性和繼承
當您從具有設計階段屬性的基底元件衍生元件或控制項時,您的元件會繼承基底類別的設計階段功能。如果基底功能足以應付您的用途,您不一定要重複套用屬性。然而,您還是可以覆寫相同型別屬性或套用額外屬性於衍生元件。下列程式碼片段將示範,以覆寫基底類別中套用的 BrowsableAttribute 屬性 (attribute),自訂覆寫繼承自 Control 之 Text 屬性 (property) 的控制項。
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
public class MyControl : Control {
// The base class has [Browsable(true)] applied to the Text property.
[Browsable(false)]
public override string Text {...}
...
}
套用型別轉換子、UI 型別編輯器或設計工具屬性
若要讓設計階段支援提供者與型別或型別成員產生關聯,請在類別宣告或成員宣告的上一行,套用適當的屬性型別。下列程式碼範例示範套用至型別的 TypeConverterAttribute。
<TypeConverter(GetType(MyColorConverter)), _
Editor(GetType(MyColorEditor), GetType(UITypeEditor))> _
Structure MyColor
...
End Structure
[ TypeConverter(typeof(MyColorConverter))]
[ Editor(typeof(MyColorEditor), typeof(UITypeEditor))]
struct MyColor {...}
如果屬性 (Property) 的型別沒有相關的型別轉換子或 UI 型別編輯器,或如果您想要覆寫與屬性 (Property) 型別相關的預設型別轉換子或 UI 型別編輯器,您可以將屬性 (Attribute) 套用於屬性 (Property) 本身。如果要將型別轉換子與屬性產生關聯,請將 TypeConverterAttribute 套用至屬性宣告,如下列程式碼範例所示。
<TypeConverter(GetType(PointConverter))> _
Public Property MyLocation() As Point
...
End Property
[ TypeConverter(typeof(PointConverter))]
public Point MyLocation {...}
如果要將 UI 型別編輯器與屬性產生關聯,請將 EditorAttribute 套用至屬性,如下列程式碼範例所示。
<Editor(GetType(FlashTrackBarDarkenByEditor), _
GetType(UITypeEditor))> _
Public Property DarkenBy() As Byte
...
End Property
[ Editor(typeof(FlashTrackBarDarkenByEditor), typeof(UITypeEditor))]
public byte DarkenBy {...}
設計工具可以與型別 (而非屬性) 產生關聯。若要將設計工具與型別產生關聯,請直接在類別宣告上方套用 DesignerAttribute,如下列程式碼範例所示。
<Designer(GetType(HelpLabel.HelpLabelDesigner))> _
Public Class HelpLabel
Inherits System.Windows.Forms.Control
Implements System.ComponentModel.IExtenderProvider
...
End Class
[Designer(typeof(HelpLabel.HelpLabelDesigner))]
public class HelpLabel : System.Windows.Forms.Control, System.ComponentModel.IExtenderProvider {...}
注意事項: |
---|
在上述範例中,TypeConverterAttribute、EditorAttribute 和 DesignerAttribute 類別的建構函式會接受 System.Type 物件,做為其引數。如果型別位在與設計階段類別相同的組件中,這些屬性的建構函式表單就能運作。如果設計階段類別在不同組件,那麼就需要不同的屬性建構函式格式 (稱為組件限定格式),如下列範例所示。 |
<Designer("System.Windows.Forms.Design.DocumentDesigner, System.Design")> _
Public Class MyForm
Inherits Form
...
End Class
[Designer("System.Windows.Forms.Design.DocumentDesigner, System.Design")]
public class MyForm : Form {...}
組件層級的設計階段屬性
ASP.NET 提供組件層級屬性 (System.Web.UI.TagPrefixAttribute),此屬性可以讓控制項開發人員指定 ASP.NET 控制項的標記前置詞。此標記前置詞是由 Visual Studio .NET 自動插入控制項的 Register 指示詞中,以便能在包含預先指定標記前置詞 (<tagprefix:controlname runat = server /> ) 的網頁上,以宣告方式使用該控制項。
注意事項: |
---|
TagPrefixAttribute 只能在視覺化設計工具 (Visual Designer) 中運作。如果您使用文字編輯器 (例如 Notepad) 撰寫 ASP.NET 網頁,您需要親自在控制項的 Register 指示詞中指定標記前置詞和命名空間。 |
下列程式碼範例會示範如何套用 TagPrefixAttribute。屬性建構函式的第一個引數指定命名空間,而第二個指定標記前置詞。
<assembly: TagPrefix("SimpleControls", "simple")>
Namespace SimpleControls
<Designer("SimpleControl.Design.SimpleDesigner, SimpleControl")> _
Public Class SimpleControl
Inherits System.Web.UI.WebControls.WebControl
...
End Class
End Namespace
[ assembly:TagPrefix("SimpleControls", "simple") ]
namespace SimpleControls {
[
Designer("SimpleControl.Design.SimpleDesigner, SimpleControl")
]
public class SimpleControl : System.Web.UI.WebControls.WebControl {}
}
請參閱
工作
HOW TO:在 Windows Form 控制項中套用屬性