06-10-12, 12:20 AM
كاتب الموضوع : silverlight
الموضوع : تطوير الكونترول Property Attributesاللغة المستخدمة: الفيجوال بيسك
التطبيق: فيجوال استوديو 2005 و 2008
المستوي: التقييم متروك للقارئ
إعداد: مهندس / عمر أمين إبراهيم
هناك الكثير من Attributes التي تتحكم في خواص وصفات Property الموجودة في أي كونترول وتستخدم هذه Attributes في إرسال معلومات الي IDE أو Integrated Development Environment وذلك من خلال IntelliSense تحديدا ولسوف نقوم بتعريف بعض هذه Attributes نظرا لأهميتها في تطوير الكونترول فهي تلعب دورا هاما في ظهور الكونترول في مرحلة التصميم Design بشكل احترافي وأيضا تضيف الي الكونترول الكثير من الصفات الهامة.
بعض هذه Attributes مذكور أدناه ولمزيد من المعلومات يمكن للقارئ أن يطلع علي System.ComponentModel Namespace
حيث سيجد الكثير من الأشياء الهامة التي سوف نتحدث عنها لاحقا لأهميتها في تطوير الكونترول ومن هذه الأشياء ِAttributes التي تخص تحديدا Property وهي موضوعنا الحالي. ولاستخدام أي Attribute يجب عمل Import لهذه Namespace
BrowsableAttribute
CategoryAttribute
DescriptionAttribute
DefaultValueAttribute
DisplayNameAttribute
EditorAttribute
DesignerSerializationVisibilityAttribute
BrowsableAttribute
هذا Attribute الهدف منه شئ واحد فقط وهو ضبط خاصية ظهور أو إخفاء Property في Properties Window
هذا Attribute له قيمته عبارة عن Boolean إما True أو False
لو تم ضبط قيمة هذا Attributeعلي أنها True فان ذلك يعني أن Property يمكن التحكم فيها في حالة Design وفي حالة Run Time أما إذا كانت القيمة False فذلك يعني أن هذه Property يمكن التحكم فيها في مرحلة run Time فقط
المثال التالي يوضح كيفية استخدام BrowsableAttribute في الحالتين
كود :
Imports System.ComponentModel
Public Class MyControl
Inherits Control
' الخاصيه ظاهره
<Browsable(True)> _
Public Property MyColor1() As Color
Get
End Get
Set(ByVal value As Color)
End Set
End Property
' الخاصيه مختفيه
<Browsable(False)> _
Public Property MyColor2() As Color
Get
End Get
Set(ByVal value As Color)
End Set
End Property
End Class
هذا Attribute الهدف منه شئ واحد فقط وهو التصنيف الذي سوف تظهر تحته Property في Properties Window
هذا Attribute له قيمه واحده فقط وهي عبارة عن String
لو تم ضبط قيمة هذا Attributeعلي أنها "Xtra Appearance" مثلا فان ذلك يعني أن Property سوف تظهر تحت Category يسمي Xtra Appearance وهذا Attribute يتم إضافته الي Property في حالة Design وهو مرتبط مع BrowsableAttribute لان Property يجب أن تكون ظاهره في Properties Windows وبالتالي يتم تصنيفها بعد ذلك أي يتم إضافة CategoryAttribute لها بالطبع يمكن إضافة هذا Attribute أيضا حتى لو كانت BrowsableAttribute يساوي False ولكنها لن تكون ذات قيمه في هذه الحالة.
أيضا إذا لم يتم إعطاء قيمه لهذا Attribute فان Property سيتم تصنيفها تحت Misc وهي Default Value كما بالمثال السابق لم يتم إضافة CategoryAttribute وبالتالي فان Property سيتم تصنيفها تحت Misc.
المثال التالي يوضح كيفية استخدام CategoryAttribute
كود :
Imports System.ComponentModel
Public Class MyControl
Inherits Control
' الخاصيه ظاهره
<Browsable(True)> _
<Category("Xtra Appearance")> _
Public Property MyColor1() As Color
Get
End Get
Set(ByVal value As Color)
End Set
End Property
End Class
هذا Attribute الهدف منه شئ واحد فقط وهو عبارة توضيح الهدف من الصفة Property وهو عبارة عن Help أو وصف عام وسريع لأي Property في Properties Window
و عندما يقف المبرمج بالماوس علي هذه الصفه في مرحلة التصميم سيظهر ما كتبناه بين الاقواس كنوع من التعريف لهذه الخاصيه Property في اسفل Properties Window
كود :
Imports System.ComponentModel
Public Class MyControl
Inherits Control
' الخاصيه ظاهره
<Browsable(True)> _
<Category("Xtra Appearance")> _
<Description("Just For Demo Purpose")> _
Public Property MyColor1() As Color
Get
End Get
Set(ByVal value As Color)
End Set
End Property
End Class
هذا Attribute ومن الواضح من اسمه يختص بتحديد القيمة الأولية أو القيمة الافتراضية لأي Property واعتقد أن الكثير منكم قد لاحظ أن القيم التي تخص كل Property ليست مكتوبة بخط Bold وعند تغيير بيانات Property يتحول الخط الي Bold وذلك حتى يعرف المبرمج أن القيمة الافتراضية قد تم تغييرها الي قيمه جديدة وعندما نقوم بتصميم أو تطوير Control فإننا نريد أن يحدث نفس الشيء لذلك يتم تحديد القيمة الافتراضية لأي Property قمنا بإضافتها الي الكونترول وتختلف DefaultValueAttribute باختلاف نوع Property نفسها طبعا مع الوضع في الاعتبار أن عدم إضافة DefaultValueAttribute الي Property سيجعل الخط المكتوبة به هذه Property عبارة عن Bold
المثال التالي يوضح الأمر ولقد تم تحديد القيمة الافتراضية محدده في حالة MyColor1 Property وبالتالي سيظهر الخط المكتوبة به قيمة هذه Property كخط Normal وأيضا لم يتم تحديد القيمة الافتراضية في حالة MyNumber1 Property لذا سيظهر الخط المكتوبة به قيمة هذه Property كخط Bold
كود :
Imports System.ComponentModel
Public Class MyControl
Inherits Control
Private myColor As Color = Color.White
<Browsable(True)> _
<Category("Xtra Appearance")> _
<Description("Just For Demo Purpose")> _
<DefaultValueAttribute(GetType(Color), "White")> _
Public Property MyColor1() As Color
Get
Return myColor
End Get
Set(ByVal value As Color)
myColor = value
End Set
End Property
Private myNumber As Integer = 10
<Browsable(True)> _
<Category("Xtra Appearance")> _
<Description("Just For Demo Purpose")> _
Public Property myNumber1() As Integer
Get
Return myNumber
End Get
Set(ByVal value As Integer)
myNumber = value
End Set
End Property
End Class
هذا Attribute ومن الواضح من اسمه يختص بإعطاء Property اسم ما وبما انه عبارة عن String بالتالي يمكن عرض الاسم كما نشاء ولو نظرنا الي المثال التالي سنجد انه قد تم إضافة DisplayNameAttribute والاسم الموجود بين الأقواس عبارة عن String غير متصل ومثال علي ذلك لتوضيح الامر.
في أي كونترول سنجد خاصية BackColor Property وهنا يمكننا استخدام هذا Attribute لعرض الاسم في Properties Window بهذا الشكل Back Color ولكن عندما نريد أن نستخدم هذه Property ٌ سوف نستخدم المسمي BackColor كاملا
في الواقع هذه الخاصية هامه جدا عندما نقوم بعمل Data Binding الي أي Windows Forms Controls ولكن هذا موضوع مختلف و ربما نتحدث عنه في مقال أخر
كود :
Imports System.ComponentModel
Public Class MyControl
Inherits Control
Private myColor As Color = Color.White
<Browsable(True)> _
<Category("Xtra Appearance")> _
<Description("Just For Demo Purpose")> _
<DefaultValueAttribute(GetType(Color), "White")> _
<DisplayName("My Revised Name")> _
Public Property MyColor1() As Color
Get
Return myColor
End Get
Set(ByVal value As Color)
myColor = value
End Set
End Property
End Class
هذا Attribute يحدد Editor الذي سوف يتم استخدامه للتغيير في قيمة أو قيم Property في الواقع هذا ِAttribute وكل ما يخص Property Editing مثل UITypeEditor مع مجموعه أخري من Classes يمثلون حجر الزاوية في تطوير الكونترول في مرحلة Design
ولتوضيح الأمر أكثر نأخذ علي سبيل المثال خاصية BackgroundImage Property وهي خاصية موجودة في أي كونترول تقريبا وعند الوقوف علي هذه الخاصية بالماوس سيظهر لنا Button صغير وبالضغط عليه سيفتح نافذة ما ومن هناك يتم اختيار الصورة التي من الممكن إضافتها الي الكونترول
إن هذا Button الصغير ما هو إلا عبارة عن Editor معين قد تم إضافته الي الخاصية BackgroundImage باستخدام EditorAttribute عموما هذا الموضوع فقط يحتاج الي مقال منفصل وربما أكثر من مقال والمثال التالي يوضح كيفية إضافة EditorAttribute الي Property وفي المثال قمت بإضافة Class جديد باسم MyImageEditor ثم قمت عمل Inherit الي UITypeEditor وتحديدا قمت بعمل Overrides لأحدي Functions الموجودة في UITypeEditor وهي GetEditStyle طبعا لكي يعمل الامر بشكل صحيح يجب علينا أن نتعامل مع معظم Functions الموجودة داخل UITypeEditor Class ومن ثم قمت باستخدام EditorAttribute مع MyImage Property لكي احدد لها فقط Editor المسئول عن التعديل في Property
وهذا لتوضيح الأمر للقارئ فقط بكيفية استخدام EditorAttribute إما لكي تعمل الأمور بشكل صحيح فانن لدينا الكثير لنضيفه الي الكود وكما قلت سابقا أن التعامل مع Property Editor يحتاج الي أكثر من مقال
كود :
Imports System.ComponentModel
Imports System.Security.Permissions
Imports System.Drawing.Design
Public Class Mycontrol
Inherits Control
Private Img As Image
<BrowsableAttribute(True), EditorAttribute(GetType(MyImageEditor), GetType(System.Drawing.Design.UITypeEditor))> _
Public Property MyImage() As Image
Get
Return Img
End Get
Set(ByVal value As Image)
Img = value
End Set
End Property
End Class
<PermissionSetAttribute(System.Security.Permissions.SecurityAction.Demand, Name:="FullTrust")> _
Public Class MyImageEditor
Inherits UITypeEditor
Public Sub New()
End Sub
Public Overloads Overrides Function GetEditStyle(ByVal context As ITypeDescriptorContext) As UITypeEditorEditStyle
Return UITypeEditorEditStyle.Modal
End Function
' Add Code for more Functions and methods as Required Here
End Class
هذا Attribute من أهم وظائفه هو إضافة Components أو كلاس معين الي الكونترول ومن ثم التحكم بخواصها للاستفادة منها في تطوير الكونترول والمثال المرفق يوضح الأمر بشكل مناسب حيث أننا قمنا بإضافة الكلاس MyComponents بكل Properties الموجودة به تحت Property واحده فقط وهي MyData Property الموجودة داخل الكونترول MyControl
كود :
Imports System.ComponentModel
Imports System.Security.Permissions
Imports System.Drawing.Design
Public Class Mycontrol
Inherits Control
<DesignerSerializationVisibility(DesignerSerializationVisibility.Content)> _
Public ReadOnly Property MyData() As MyComponents
Get
Return New MyComponents()
End Get
End Property
End Class
' This attribute indicates that the public properties of this object should be listed in the property grid.
<TypeConverterAttribute(GetType(System.ComponentModel.ExpandableObjectConverter))> _
Public Class MyComponents
Private Color1 As Color
Private Color2 As Color
Private x As Integer
Public Sub New()
End Sub
Public Property Mycolor1() As Color
Get
Return Color1
End Get
Set(ByVal value As Color)
Color1 = value
End Set
End Property
Public Property MyColor2() As Color
Get
Return Color2
End Get
Set(ByVal value As Color)
Color2 = value
End Set
End Property
Public Property MyInteger() As Integer
Get
Return x
End Get
Set(ByVal value As Integer)
x = value
End Set
End Property
End Class
في واقع الأمر يوجد الكثير والكثير من Attributes الهامة جدا والتي لها دور هام في خروج الكونترول بشكل احترافي وكما قلت سابقا لمن يريد المزيد من المعلومات عليه بمراجعة محتويات System.ComponentModel Namespace
أتمني فقط أننا قد قمنا بتوضيح بعض النماذج الهامة التي تخص Property Attributes وكيفية استخدامها داخل الكونترول
ملحوظه :
اعلم جيدا أن بعض القراء يريدون تطبيق عملي للمقالات المنشورة تباعا تحت عنوان تطوير الكونترول ولكن ليعلموا أن هناك الكثير من الأمور التي يجب توضيحها قبل أن نقوم بتطبيق عملي وهذه الأشياء تتمثل في
Editors
VisualStyleRenderer
GDI+
Designers
عموما أعدكم بتطبيق عملي أو بمشروع صغير مع الجزء الرابع من تطوير الكونترول الذي سيكون موضوعه عن Designers تحديدا حيث أن GDI+ و Editors و VisualStyleRenderer ممكن اعتبارها موضوعات منفصلة وربما بعضها واضح للقارئ من أي مصادر أخري
بالتوفيق
أخوكم عمر
يمكن متابعة الاجزاء السابقه علي هذه اللينك
الجزء الأول
http://vb4arb.com/vb/showthread.php?1200
الجزء الثاني
http://vb4arb.com/vb/showthread.php?1240