05-10-12, 11:50 AM
كاتب الموضوع : silverlight
بسم الله الرحمن الرحيم
بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته
في الجزء الأول http://vb4arb.com/vb/showthread.php?1178 من المقال ناقشنا كيفية استخدام Custom EventHandler مع أي Class ولقد أوضحنا أنه لكي نقوم بذلك نحتاج إلي شيئان أساسيان وهما كالأتي:
أن يكون لدينا Property تشير إلي EventHandlerList وهي التي سوف تعمل بمثابة المخزن الذي سوف نقوم بتخرين جميع EventHandler به
أن نقوم بعمل Dispose لهذه EventHandler وبالتالي يجب علينا أن نقوم باستخدام IDisposable Interface
واليوم سوف نوضح كيفية إضافة Custom EventHandler إلي أي كلاس لكن بدون استخدام EventHandlerList و الخطوات التاليه توضح ذلك
أولا نفوم بتعريف متغير يشير الي EventHandler
ثانيا نقوم بإضافة Custom EventHandler كما فعلنا في الجزء الأول من المقال
ثالثا علينا أن نكتب الكود المناسب الي هذه Custom EventHandler
الكودالتالي يوضح ذلك
كود :
Private m_themeChanged As EventHandler = Nothing
#Region " Events "
Public Custom Event ThemeChanged 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
#End Region
كود :
#Region " Events "
Public Custom Event ThemeChanged As EventHandler
AddHandler(ByVal value As EventHandler)
Me.m_themeChanged = CType([Delegate].Combine(Me.m_themeChanged, value), EventHandler)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.m_themeChanged = CType([Delegate].Remove(Me.m_themeChanged, value), EventHandler)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
Dim handler As EventHandler = Me.m_themeChanged
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
End If
End RaiseEvent
End Event
#End Region
الكود التالي يوضح الشكل النهائي للكلاس ولكي يعمل الكود بشكل دقيق نحتاج أن نستخدم الكلاسات الاضافية الموجودة بالجزء الأول وهي علي الترتيب
ThemeConverter Class
ThemeEditor Class
ThemesUtilty Clss
أيضا لم أقم باستخدام IDisposable Interface وتركت هذا الأمر للقارئ وخاضة أننا أوضحنا كيفية استخدامه في الجزء الأول
كود :
<TypeConverter(GetType(ThemeConverter)), Editor(GetType(ThemeEditor), GetType(UITypeEditor))> _
Public Class Themes
#Region " Fields "
Private m_startColor As Color
Private m_startColorMiddle As Color
Private m_endColor As Color
Private m_endColorMiddle As Color
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_themeChanged As EventHandler = Nothing
#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
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 "
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)
RaiseEvent ThemeChanged(sender, e)
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.m_themeChanged = CType([Delegate].Combine(Me.m_themeChanged, value), EventHandler)
End AddHandler
RemoveHandler(ByVal value As EventHandler)
Me.m_themeChanged = CType([Delegate].Remove(Me.m_themeChanged, value), EventHandler)
End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
Dim handler As EventHandler = Me.m_themeChanged
If (handler IsNot Nothing) Then
handler.Invoke(sender, e)
End If
End RaiseEvent
End Event
#End Region
End Class
كود :
Public Class ThemeControl
Inherits Control
Private m_theme As Themes
Public Sub New()
SetStyle(ControlStyles.SupportsTransparentBackColor, True)
SetStyle(ControlStyles.Opaque, False)
SetStyle(ControlStyles.DoubleBuffer, True)
SetStyle(ControlStyles.AllPaintingInWmPaint, True)
SetStyle(ControlStyles.UserPaint, True)
UpdateStyles()
m_theme = New Themes
AddHandler Me.m_theme.ThemeChanged, New EventHandler(AddressOf Me.ThemeColor_ThemeChanged)
End Sub
Public Property Theme() As Themes
Get
Return m_theme
End Get
Set(ByVal value As Themes)
If Me.m_theme IsNot value Then
Me.m_theme = value
AddHandler Me.m_theme.ThemeChanged, New EventHandler(AddressOf Me.ThemeColor_ThemeChanged)
End If
End Set
End Property
Protected Overrides ReadOnly Property DefaultSize() As System.Drawing.Size
Get
Return New Size(200, 100)
End Get
End Property
Private Sub ThemeColor_ThemeChanged(ByVal sender As Object, ByVal e As EventArgs)
Me.Invalidate()
End Sub
Protected Overrides Sub OnResize(ByVal e As System.EventArgs)
MyBase.OnResize(e)
Invalidate()
End Sub
Protected Overrides Sub OnPaint(ByVal e As System.Windows.Forms.PaintEventArgs)
MyBase.OnPaint(e)
If m_theme.ApplyTheme Then
m_theme.DrawTheme(e.Graphics, New Rectangle(0, 0, Me.Width, 24))
Dim r As New Rectangle(0, 0, Me.ClientRectangle.Width - 1, Me.ClientRectangle.Height - 1)
Using controlPen As New Pen(Me.m_theme.ThemeBorderOut)
e.Graphics.DrawRectangle(controlPen, r)
End Using
End If
End Sub
End Class
الهدف من هذه الموضوعات هو التوضيح للقارئ الأساليب المختلفة والغير تقليدية لكيفية اضافة Custom EventHandler إلي اي كلاس نشاء
تقبلوا تحياتي
أخوكم عمر