05-10-12, 11:47 AM
كاتب المشاركة : silverlight
بسم الله الرحمن الرحيم
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
الأن سوف نجيب علي السؤال الذي طرحناه في المشاركة الأولي ألا وهو كيف نضيف Custom EventHandler إلي أي كلاس
بالتأكيد أن من سيقرأ هذا الموضوع يعلم جيدا ما هو الكلاس Class وأيضا يعلم جيدا كيف يقوم ببناء كلاس ما........
وكما سبق وكتبت أنه ولكي نبني شيئا مناسبا يمكن استخدامه بشكل جيد فنحن غالبا سنحتاج الي الأشياء التالية
الكلاس الموجود به الألوان
نحتاج إلي كلاس تم توريثه من TypeConverter
نحتاج الي كلاس تم توريثه من TypeEditor
ثم اي كلاسات أخري نريد إضافتها
ثم بالنهاية كلاس تم توريثه من الكونترول مثلا حيث سنضيف له الكلاس الموجودة به الألوان ومن ثم نستخدمها في تلوين الكونترول
والأن لنكتب كلاسا بسيطا يحتوي علي مجموعة من Properties و بعض الدوال و Sub إضافة الي اي شئ أخر نريده ولسوف نطلق علي الكلاس الذي سوف نستخدمه إسم ThemeColors
الكود التالي يوضح الشكل المبدئي للكلاس
كود :
Imports System.Drawing.Design
Public Class ThemeColors
#Region " Fields "
Private m_northBegin As Color
Private m_northEnd As Color
Private m_southBegin As Color
Private m_southEnd As Color
Private m_borderOut As Color
Private m_borderIn As Color
#End Region
#Region " Constructor "
Public Sub New()
Me.m_northBegin = Color.Transparent
Me.m_northEnd = Color.Transparent
Me.m_southBegin = Color.Transparent
Me.m_southEnd = Color.Transparent
Me.m_borderOut = Color.Transparent
Me.m_borderIn = Color.Transparent
End Sub
Public Sub New(ByVal northColorBegin As Color, _
ByVal northColorEnd As Color, _
ByVal southColorBegin As Color, _
ByVal southcolorEnd As Color, _
ByVal borderOut As Color, _
ByVal borderIn As Color)
Me.m_northBegin = northColorBegin
Me.m_northEnd = northColorEnd
Me.m_southBegin = southColorBegin
Me.m_southEnd = southcolorEnd
Me.m_borderOut = borderOut
Me.m_borderIn = borderIn
End Sub
#End Region
#Region " Properties "
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthBegin() As Color
Get
Return m_northBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northBegin = value
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthEnd() As Color
Get
Return Me.m_northEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northEnd = value
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthBegin() As Color
Get
Return m_southBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southBegin = value
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthEnd() As Color
Get
Return m_southEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southEnd = value
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderOut() As Color
Get
Return Me.m_borderOut
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderOut = value
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderIn() As Color
Get
Return Me.m_borderIn
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderIn = value
End Set
End Property
#End Regionالأن لنضيف لهذا الكلاس متغير يشير إلي EventHandlerList وهي ستعمل هنا بمثابة المخزن الذي سوف يتم تخزين جميع Custom EventHandler به ثم نضيف Property تعبر عن هذا المتغير والكود التالي يوضح ذلك
كود :
Private m_events As EventHandlerList = Nothing
Protected ReadOnly Property Events() As EventHandlerList
Get
If m_events Is Nothing Then
m_events = New EventHandlerList()
End If
Return m_events
End Get
End Propertyكود :
#Region " Events "
Public Custom Event ThemeChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("ThemeChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("ThemeChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("ThemeChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
#End Regionكود :
Protected Overridable Sub OnThemeChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim handler As EventHandler = CType(Me.Events("ThemeChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
RaiseEvent ThemeChanged(sender, e)
End If
End Subعندما نكتب جملة Implements IDisposable سيقوم الفيجوال استوديو بإضافة الكود التالي الي الكلاس حيث هنا علينا أن نقوم بعمل Dispse لأي EventHandler أو أي شئ أخر نريده
كود :
Implements IDisposable
Private disposedValue As Boolean = False ' To detect redundant calls
' IDisposable
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.disposedValue Then
If disposing Then
' TODO: free other state (managed objects).
End If
' TODO: free your own state (unmanaged objects).
' TODO: set large fields to null.
End If
Me.disposedValue = True
End Sub
#Region " IDisposable Support "
' This code added by Visual Basic to correctly implement the disposable pattern.
Public Sub Dispose() Implements IDisposable.Dispose
' Do not change this code. Put cleanup code in Dispose(ByVal disposing As Boolean) above.
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
#End Regionولقد قمت بكتابة بعض الأحداث الإضافية وبعض الكلاسات الاضافية حتي استطيع كتابة كلاسا بشكل جيد يمكنكم أن تستفيدوا منه جيدا
والكود التالي يوضح الشكل النهائي للكلاس ThemeColors
كود :
Imports System.ComponentModel
Imports System.Drawing.Design
<TypeConverter(GetType(ThemeConverter)), Editor(GetType(ThemeEditor), GetType(UITypeEditor))> _
Public Class ThemeColors
Implements IDisposable
#Region " Fields "
Private m_northBegin As Color
Private m_northEnd As Color
Private m_southBegin As Color
Private m_southEnd As Color
Private m_borderOut As Color
Private m_borderIn As Color
Private m_events As EventHandlerList = Nothing
Private m_disposed As Boolean = False
#End Region
#Region " Constructor "
Public Sub New()
Me.m_northBegin = Color.Transparent
Me.m_northEnd = Color.Transparent
Me.m_southBegin = Color.Transparent
Me.m_southEnd = Color.Transparent
Me.m_borderOut = Color.Transparent
Me.m_borderIn = Color.Transparent
End Sub
Public Sub New(ByVal northColorBegin As Color, _
ByVal northColorEnd As Color, _
ByVal southColorBegin As Color, _
ByVal southcolorEnd As Color, _
ByVal borderOut As Color, _
ByVal borderIn As Color)
Me.m_northBegin = northColorBegin
Me.m_northEnd = northColorEnd
Me.m_southBegin = southColorBegin
Me.m_southEnd = southcolorEnd
Me.m_borderOut = borderOut
Me.m_borderIn = borderIn
End Sub
#End Region
#Region " Properties "
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Protected ReadOnly Property Events() As EventHandlerList
Get
If m_events Is Nothing Then
m_events = New EventHandlerList()
End If
Return m_events
End Get
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthBegin() As Color
Get
Return m_northBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northBegin = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeNorthEnd() As Color
Get
Return Me.m_northEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_northEnd = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthBegin() As Color
Get
Return m_southBegin
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southBegin = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeSouthEnd() As Color
Get
Return m_southEnd
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_southEnd = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderOut() As Color
Get
Return Me.m_borderOut
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderOut = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property
<DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)> _
Public Property ThemeBorderIn() As Color
Get
Return Me.m_borderIn
End Get
Set(ByVal value As Color)
If value.IsEmpty Then
value = Color.Transparent
End If
Me.m_borderIn = value
Me.OnThemeChanged(Me, EventArgs.Empty)
End Set
End Property
#End Region
#Region " Methods "
Protected Overridable Sub Dispose(ByVal disposing As Boolean)
If Not Me.m_disposed Then
If disposing Then
Dim handler As EventHandler = CType(Me.Events("ThemeChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
handler = Nothing
End If
End If
End If
Me.m_disposed = True
End Sub
Public Sub Dispose() Implements IDisposable.Dispose
Dispose(True)
GC.SuppressFinalize(Me)
End Sub
Friend Sub DrawTheme(ByVal gr As Graphics, ByVal rect As Rectangle)
ThemesUtility.DrawGradient(gr, rect, Me.ThemeNorthBegin, Me.ThemeNorthEnd, Me.ThemeSouthBegin, Me.ThemeNorthEnd, Me.ThemeBorderOut, Me.ThemeBorderIn)
End Sub
Friend Function ApplyTheme() As Boolean
Return ((Me.ThemeNorthBegin <> Color.Empty) AndAlso (Me.ThemeNorthEnd <> Color.Empty) AndAlso (Me.ThemeSouthBegin <> Color.Empty) AndAlso (Me.ThemeSouthEnd <> Color.Empty))
End Function
Protected Overridable Sub OnThemeChanged(ByVal sender As Object, ByVal e As EventArgs)
Dim handler As EventHandler = CType(Me.Events("ThemeChangedEvent"), EventHandler)
If (handler IsNot Nothing) Then
RaiseEvent ThemeChanged(sender, e)
End If
End Sub
Public Overrides Function ToString() As String
Return String.Empty
End Function
#End Region
#Region " Events "
Public Custom Event ThemeChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.Events.AddHandler("ThemeChangedEvent", value)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.Events.RemoveHandler("ThemeChangedEvent", value)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
CType(Me.Events("ThemeChangedEvent"), EventHandler).Invoke(sender, e)
End RaiseEvent
End Event
#End Region
End Classبالتاكيد من الصعب توضيح كل سطر من الكود فهذا الأمر يحتاج الي الكثير من الوقت ولذلك أعتقد أن هذا الموضوع ليس موجها للمبتدئين .................. ولكن بالتأكيد تستطيعون الاستفسار عن ما تريدون
يتبع في المشاركة التالية ...............................................
