05-10-12, 11:45 AM
كاتب الموضوع : silverlight
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
جميعنا يعلم ماذا تعني كلمات مثل Event و EventArgs و EventHandler حيث أن جميع الكونترول الموجودة بالدوت نت قلما تخلو من مثل هذه المسميات وبالتأكيد الغالبية ممن سيقرأون هذا الموضوع يعرفون جيدا كيف يتعاملون مع مثل هذه الأشياء من حيث بنائها أو إضافتها الي الكونترول أو الكلاسات المختلفة
لكن ومنذ سنوات أضافت مايكروسوفت إمكانية جديدة ألا وهي استخدام ما يطلقون عليه Custom EventHandler وهذا أتاح للمبرمج إمكانية إضافة أحداث جديدة إلي الكونترول أو الكلاس بشكل أفضل وأيضا هذا أتاح له إمكانية التعديل علي الأحداث الموجودة في الكونترول أو الكلاسات المختلفة الموجودة بالدوت نت
أهم مميزات استخدام Custom EventHandler
تعتبر أهم مميزات استخدام Custom EventHandler هي التوفير في استهلاك ذاكرة الكمبيوتر وأيضا إن استخدامها بشكل دقيق وإعطائها مسميات دقيقة مختلفة عن بعضها البعض لن يؤدي الي أي نوع من انواع Blocking لبعضها البعض أثناء تنفيذها
الكود التالي يوضح شكل Custom EventHandler ولقد أعطيتها إسما شائعا ألا وهو PropertyChanged
سنلاحظ اننا عندما نقوم بكتابة الجملة Public Custom Event PropertyChanged As EventHandler أن الفيجوال استوديو قام بإضافة باقي الكود اتوماتيكيا أي أن الفيجوال استوديو قام بكتابة حوالي خمسون بالمائة من الكود والباق من الكود يجب علينا أن نقوم بكتابته بأنفسنا
كود :
Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
End RaiseEvent
End Eventكود :
Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("PropertyChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("PropertyChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("PropertyChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Eventكيف نضيف Custom EventHandler إلي Component أو إلي Control
في واقع الأمر إن إضافة أي Custom EventHandler إلي Component أو Control يمكن إعتباره أمر تقليدي وتكراري وهو لن يختلف كثيرا عن الكود الذي كتبناه أعلاه
أيضا من الممكن إعتباره هو الجزء الأسهل في موضوعنا هذا والسبب في ذلك هو أن أي Component أو كونترول يمتلك Events Property وبالتالي هي تعمل بمثابة المخزن الذي يتم فيه تخزين أي EventHandler او Delegates يتم إضافتها الي الكونترول أو إل Component
الكود التالي يوضح كيفية إضافة Custom EventHandler إلي Control ما
سنلاحظ من الكود كيف نقوم بإضافة Custom EventHandler ومن ثم ربطها مع بعض Property وأيضا كيفية عمل Dispose لها وأيضا كيفية الإستفادة من Custom EventHandler في إخفاء بعض Handler الموجودة في الكونترول مثل BackColorChanged
كود :
Public Class ControlTest
Inherits Control
Public Sub New()
End Sub
Private m_color As Color = Color.Transparent
Public Property MyColor() As Color
Get
Return m_color
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Empty
End If
Me.m_color = value
Me.OnPropertyChanged(Me, EventArgs.Empty)
End Set
End Property
Private m_BackColor As Color = Color.Transparent
<System.ComponentModel.Browsable(False)> _
<System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Public Overrides Property BackColor() As System.Drawing.Color
Get
Return Me.m_BackColor
End Get
Set(ByVal value As System.Drawing.Color)
If value.IsEmpty Then
value = Color.Transparent
End If
' do nothing
End Set
End Property
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler = Nothing
End If
End If
MyBase.Dispose(disposing)
End Sub
Protected Overridable Sub OnPropertyChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
' Or we can use
'RaiseEvent PropertyChanged(sender, e)
End If
End Sub
Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("PropertyChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("PropertyChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("PropertyChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
<System.ComponentModel.Browsable(False)> _
<System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)> _
Public Shadows Custom Event BackColorChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("BackColorChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("BackColorChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("BackColorChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
End Classكود :
Public Class ComponentTest
Inherits System.ComponentModel.Component
Public Sub New()
End Sub
Private m_color As Color = Color.Transparent
Public Property MyColor() As Color
Get
Return m_color
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Empty
End If
Me.m_color = value
Me.OnPropertyChanged(Me, EventArgs.Empty)
End Set
End Property
Protected Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler = Nothing
End If
End If
MyBase.Dispose(disposing)
End Sub
Protected Overridable Sub OnPropertyChanged(ByVal sender As Object, ByVal e As System.EventArgs)
Dim handler As EventHandler = CType(Me.Events("PropertyChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
' Or we can use
'RaiseEvent PropertyChanged(sender, e)
End If
End Sub
Public Custom Event PropertyChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("PropertyChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("PropertyChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("PropertyChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
End Classلكي نقوم بذلك نحتاج إلي شيئان أساسيان وهما كالأتي:
أن يكون لدينا Property تشير إلي EventHandlerList وهي التي سوف تعمل بمثابة المخزن الذي سوف نقوم بتخرين جميع EventHandler به
أن نقوم بعمل Dispose لهذه EventHandler وبالتالي يجب علينا أن نقوم باستخدام IDisposable Interface
ولكي نوضح الأمر بمثال مناسب لنفرض جدلا اننا نريد أن نكتب كلاسا به مجموعة من Property وهي عبارة عن Color او ألوان مختلفة ومن ثم نريد بعض ذلك ان نضيف هذا الكلاس الي اي كونترول ما ونستخدم الألوان الموجودة به في رسم شئ ما علي الكونترول
ولكي نبني شيئا مناسبا يمكن استخدامه بشكل جيد فنحن غالبا سنحتاج الي الأشياء التالية
الكلاس الموجود به الألوان
نحتاج إلي كلاس تم توريثه من TypeConverter
نحتاج الي كلاس تم توريثه من TypeEditor
ثم اي كلاسات أخري نريد إضافتها
ثم بالنهاية كلاس تم توريثه من الكونترول مثلا حيث سنضيف له الكلاس الموجودة به الألوان ومن ثم نستخدمها في تلوين الكونترول
يتبع في المشاركة التالية ...............................................
