ممنون از جوابتون
زبان برنامه نویسیم Vb.Net هست
آمدم امتحان کنم برای ساخت کلاس مربوط به DesignerActionList میگه باید یک روتین New تعریف کنی
تعریف کردم میگه آرگومانت هم میخواد!
اگه لطف کنید و مثال بزنید ممنون میشم
ابتدا در منوی Project ویژوال استدیو گزینه Add Reference را انتخاب کرده و System.Design را در لیست
پیدا کرده و اضافه کنید.
فرضا یک کلاس Component1 به پروژه تان اضافه کرده اید (منوی Project، گزینه Add Component ) که می خواهید
مواردی را به پنجره Tasks اش اضافه شود :
کد:
Public Class Component1
End Class
کتابخانه های مورد نیاز رو در ابتدای کد اضافه می کنیم :
کد:
Imports System.ComponentModel
Imports System.ComponentModel.Design
Imports System.Windows.Forms.Design
Public Class Component1
End Class
سپس کلاسی به اسم ActionList1 تعریف می کنیم که از DesignerActionList ارث بری کند :
کد:
Friend Class ActionList1
Inherits DesignerActionList
Public Sub New(ByVal component As IComponent)
MyBase.New(component)
End Sub
End Class
مواردی که باید داخل Tasks نمایش داده شوند رو باید در این کلاس مشخص کنید، اگر قراره مقداری وارد بشه از Property و
اگر قراره فرمانی اجرا بشه از Sub استفاده می کنیم. مثلا دو Property با نام های FullName و
BackColor و یک Sub با نام DefaultValues تعریف می کنیم :
کد:
Private mFullName As String
Private mBackColor As Color
Public Property FullName() As String
Get
Return mFullName
End Get
Set(ByVal value As String)
mFullName = value
End Set
End Property
Public Property BackColor() As Color
Get
Return mBackColor
End Get
Set(ByVal value As Color)
mBackColor = value
End Set
End Property
Public Sub DefaultValues()
mFullName = "My Name"
mBackColor = Color.Blue
[COLOR="Blue"] Dim d As DesignerActionUIService = GetService(GetType(DesignerActionUIService))
d.Refresh(Me.Component)[/COLOR]
End Sub
اصولا هر Property یک متغیر داره که یا ازش مقدار Property را می خوانید یا مقدار Property را داخلش می نویسید.
اون کد آبی رنگ برای اینه که بعد از تغییر دادن مقدار Property ها، Designer ویژوال استدیو از تغییر کردن شان
مطلع شود و مقادیر جدید را نمایش دهد. اگر حذف شون کنید مقادیر عوض می شوند اما چون Designer مطلع نمیشه
مقادیر نمایشی در حین نمایش پنجره Tasks به ظاهر تغییری نمی کنند.
کلاس ما نیاز به یک GetSortedActionItems هم دارد که باید Overrides شود و مهم ترین بخش کلاس است،
هر چیزی که داخل پنجره Tasks نمایش داده می شود اینجا مشخص خواهد شد :
کد:
Public Overrides Function GetSortedActionItems() As System.ComponentModel.Design.DesignerActionItemCollection
Dim items As New DesignerActionItemCollection
.
.
.
Return items
End Function
مثلا دو بخش مجزا (Header) ایجاد می کنیم که در یکی FullName و BackColor و در دیگری DefaultValues
نمایش داده شوند، برای هر آیتم هم یک عنوان نمایشی و توضیحات اضافه می کنیم :
کد:
Public Overrides Function GetSortedActionItems() As System.ComponentModel.Design.DesignerActionItemCollection
Dim items As New DesignerActionItemCollection
[COLOR="Blue"] items.Add(New DesignerActionHeaderItem("My Properties"))
items.Add(New DesignerActionHeaderItem("My Methods"))
items.Add(New DesignerActionPropertyItem("FullName" _
, "Full name", "My Properties", "Please enter your full name."))
items.Add(New DesignerActionPropertyItem("BackColor" _
, "Back color", "My Properties", "Please enter back color."))
items.Add(New DesignerActionMethodItem(Me, "DefaultValues" _
, "Default values", "My Methods", "Reset properties."))[/COLOR]
Return items
End Function
حالا کلاس ActionList1 آماده است، باید یک کلاس دیگر بسازیم که از ComponentDesigner (اگر برای
Component ها Tasks می سازید) یا ControlDesigner (اگر برای Control ها Tasks می سازید) ارث بری کند.
این کلاس ساختار ساده ای دارد، فقط باید اون کلاسی که قبلا ساخته ایم را به عنوان لیست Action ها برگرداند.
مثلا کلاس Designer1 را تعریف می کنیم که از لیستی که ActionList1 ارائه می کند استفاده خواهد کرد :
کد:
Friend Class Designer1
Inherits ComponentDesigner
Private list As DesignerActionListCollection
Public Overrides ReadOnly Property ActionLists() As System.ComponentModel.Design.DesignerActionListCollection
Get
If list Is Nothing Then
list = New DesignerActionListCollection()
list.Add(New [B][COLOR="Blue"]ActionList1[/COLOR][/B](Me.Component))
End If
Return list
End Get
End Property
End Class
حالا دقیقا قبل از کلاس اصلی Component1 مان یک سطر کد اضافه می کنیم که کلاس Designer1 را به عنوان
Designer این Component معرفی کند :
کد:
[COLOR="Blue"]<System.ComponentModel.Designer(GetType(Designer1))> _[/COLOR]
Public Class Component1
End Class
کد را یکبار کامپایل کنید تا تغییرات روی Component1 اعمال شوند.
البته اینها اساس کار اند، اگه بخواهید این مقادیر با Component اصلی در ارتباط باشند به کد نویسی بیشتری
نیاز دارید، مثلا اگر بخواهید مقادیر بعد از خروج از برنامه Save شوند باید Serialization رو برای Property ها
فعال کنید. در مثال پیوستی اینکار انجام شده.
یک مثال کامل ضمیمه این پست می باشد. TasksSample.zip