استهلاك الأحداث
لاستهلاك حدث في تطبيق , يجب أن توفر معالج أحداث (أسلوب لمعالجة الحدث) و الذي ينفذ منطق البرنامج كاستجابة إلى الحدث و يسجل معالج الأحداث مع مصدر الحدث. يشار إلى هذه العملية بتوصيل الحدث سلكياً. مصمموا المؤثرات المرئية الخاصة بنماذج Windows و نماذج ويب يوفرون أدوات تطوير سريعة للتطبيقات (RAD) و التي تبسط أو تخفي تفاصيل توصيل الحدث سلكياً.
يصف هذا الموضوع النمط العام لمعالجة الأحداث. للحصول نظرة عامة حول نموذج الحدث في .NET Framework, راجع الأحداث و المفوضون. للحصول على مزيد من المعلومات حول نموذج الحدث في Windows Forms ، راجع كيفية القيام بما يلي: استهلاك الأحداث في Windows Forms Application. للحصول على مزيد من المعلومات حول نموذج الحدث في Web Forms ، راجع كيفية القيام بما يلي: تستهلك الأحداث في تطبيق نموذج ويب.
نمط الحدث
تفاصيل توصيل الحدث سلكياً تختلف في نماذج Windows عن نماذج ويب لوجود مستويات مختلفة من الدعم المُوفَرة من قِبل أدوات RAD المختلفة. على الرغم من ذلك، كلا تسلسلي الأحداث تتبع نفس نمط الحدث , الذي له الصفات المميزة التالية:
الفئة التي ترفع حدث تسمى EventName لديها العضو التالي:
public event EventNameEventHandler EventName;
Public Event EventName As EventNameEventHandler
مفوض الحدث للحدث EventName هو EventName EventHandler ، مع التوقيع التالي:
public delegate void EventNameEventHandler(object sender, EventNameEventArgs e);
Public Delegate Sub EventNameEventHandler(sender As Object, e As EventNameEventArgs)
لإستهلاك الحدث EventName ، يجب أن يكون معالج الحدث الخاص بك له نفس توقيع مفوض الحدث :
void EventHandler(object sender, EventNameEventArgs e) {}
Sub EventHandler(sender As Object, e As EventNameEventArgs)
ملاحظة |
---|
يُسمى مُفوض الحدث في .NET Framework EventNameEventHandler ، بينما المصطلح "مفوض الحدث" في الوثائق يشير إلى أسلوب معالج للأحداث.المنطق خلف نظام التسمية هو أن مفوض EventNameEventHandler يشير إلى معالج الأحداث (الأسلوب) التي تعالج الحدث فعلياً. |
عندما لا يكون لدى حدث أي بيانات مقترنة ، الفئة التي ترفع الحدث تستخدم System.EventHandler كالمفوض و System.EventArgs لبيانات الحدث. الأحداث التي لديها بيانات مقترنة تستخدم الفئات المشتقة من EventArgs لنوع بيانات الحدث و نوع مفوض الحدث المُنَاظِر. على سبيل المثال، إذا كنت تريد معالجة حدث MouseUp في تطبيق نماذج Windows , فئة بيانات الحدث هي MouseEventArgs و هو مفوض الحدث هو MouseEventHandler. لاحظ أن العديد من أحداث الماوس تستخدام فئة مشتركة لبيانات الحدث و تستخدم مفوض حدث مشترك , لذا نظام التسمية غير متطابق تماماً الاصطلاح الموصوف أعلاه. لأحداث الماوس , معالج الأحداث الخاص بك يجب أن يكون له التوقيع التالي:
void Mouse_Moved(object sender, MouseEventArgs e){}
Sub Mouse_Moved(sender As Object, e As MouseEventArgs)
المرسل و معلمات متغيرات الحدث توفر تفاصيل إضافية حول حدث الماوس لمعالج الأحداث. الكائن المُرسِل يوضح ما الذي رفع الحدث. توفر المعلمة MouseEventArgs تفاصيل حول حركة الماوس التي رفعت الحدث. العديد من مصادر الأحداث توفر بيانات إضافية للحدث , و العديد من معالجات الأحداث تستخدم بيانات الحدث الخاصة في معالجة الحدث. للحصول على مثال يوضح رفع و معالجة الأحداث مع بيانات الحدث الخاصة , راجع كيفية القيام بـ: تنفيذ و استهلاك الأحداث.
ملاحظة |
---|
الأحداث أيضاً تنشأ خارج سياق واجهات المستخدم (UIs) و في الحقيقة, .NET Framework يتضمن الكثير من الفئات غير الـ UI التي ترفع أحداث.على الرغم من ذلك، تتبع كافة الأحداث النمط الموضح هنا. |
للحصول على معلومات حول رفع أحداث من فئة ، راجع رفع حدث .
الأحداث الثابتة و الحيوية
الـ .NET Framework يسمح المشتركين بالتسجيل للحصول على تنبيهات الأحداث بشكل ثابت أو حيوي. معالجات الأحداث الثابتة تقع ضمن حيّز تأثير كامل عمر الفئة التي تقوم بمعالجة أحداثها. هذا هو الأسلوب الأكثر شيوعاً لمعالجة الأحداث. معالجات الأحداث الحيوية تُنَشط و تُعَطل بشكل صريح أثناء تنفيذ البرنامج , عادةً كاستجابة إلى بعض المنطق الشرطي للبرنامج. على سبيل المثال، يمكن استخدامها إذا كانت تنبيهات الأحداث مطلوبة فقط تحت ظروف معينة أو إذا كان أحد التطبيقات يوفر عدة معالجات للأحداث و تُحدد شروط وقت التشغيل معالج الأحداث الانسب ليتم استخدامه.
الأسلوب EventInfo.AddEventHandler يضيف معالجات أحداث حيوية و الأسلوب EventInfo.RemoveEventHandler يُعطِلها. توفر اللغات المفردة أيضاً الميزات الخاصة بهم لمعالجة الأحداث بشكل حيوي. يعرف المثال التالي فئة TemperatureMonitor التي ترفع حدث TemperatureTheshold عندما تصل إلى درجة الحرارة إلى العتبة المعرّفة مسبقاً. معالج الأحداث الذي يشترك في هذا الحدث يتم تنشيطه و تعطيله أثناء تنفيذ البرنامج.
public class TemperatureEventArgs : Inherits EventArgs
Private oldTemp As Decimal
Private newTemp As Decimal
Public ReadOnly Property OldTemperature As Decimal
Get
Return Me.oldTemp
End Get
End Property
Public ReadOnly Property NewTemperature As Decimal
Get
Return Me.newTemp
End Get
End Property
Public Sub New(oldTemp As Decimal, newTemp As Decimal)
Me.oldTemp = oldTemp
Me.newTemp = newTemp
End Sub
End Class
Public Delegate Sub TemperatureEventHandler(sender As Object, _
ev As TemperatureEventArgs)
Public Class TemperatureMonitor
Private currentTemperature As Decimal
Private threshholdTemperature As Decimal
Public Event TemperatureThreshold As TemperatureEventHandler
Public Sub New(threshHold As Decimal)
Me.threshholdTemperature = threshHold
End Sub
Public Sub SetTemperature(newTemperature As Decimal)
If (Me.currentTemperature > threshholdTemperature And _
newTemperature <= Me.threshholdTemperature) Or _
(Me.CurrentTemperature < Me.threshholdTemperature And _
newTemperature >= Me.threshholdTemperature) Then
OnRaiseTemperatureEvent(newTemperature)
End If
Me.currentTemperature = newTemperature
End Sub
Public Function GetTemperature() As Decimal
Return Me.currentTemperature
End Function
Protected Overridable Sub OnRaiseTemperatureEvent(newTemperature As Decimal)
RaiseEvent TemperatureThreshold(Me, New TemperatureEventArgs(Me.currentTemperature, _
newTemperature))
End Sub
End Class
Public Module Example
Public Sub Main()
Dim tempMon As New TemperatureMonitor(32d)
tempMon.SetTemperature(33)
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
tempMon.GetTemperature())
tempMon.SetTemperature(32)
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
tempMon.GetTemperature())
' Add event handler dynamically using Visual Basic syntax.
AddHandler tempMon.TemperatureThreshold, AddressOf TempMonitor
tempMon.SetTemperature(33)
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
tempMon.GetTemperature())
tempMon.SetTemperature(34)
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
tempMon.GetTemperature())
tempMon.SetTemperature(32)
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
tempMon.GetTemperature())
' Remove event handler dynamically using Visual Basic syntax.
RemoveHandler tempMon.TemperatureThreshold, AddressOf TempMonitor
tempMon.SetTemperature(31)
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
tempMon.GetTemperature())
tempMon.SetTemperature(35)
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.", _
tempMon.GetTemperature())
End Sub
Private Sub TempMonitor(sender As Object, e As TemperatureEventArgs)
Console.WriteLine(" ***Warning: Temperature is changing from {0} to {1}.", _
e.OldTemperature, e.NewTemperature)
End Sub
End Module
' The example displays the following output:
' Current temperature is 33 degrees Fahrenheit.
' Current temperature is 32 degrees Fahrenheit.
' Current temperature is 33 degrees Fahrenheit.
' Current temperature is 34 degrees Fahrenheit.
' ***Warning: Temperature is changing from 34 to 32.
' Current temperature is 32 degrees Fahrenheit.
' Current temperature is 31 degrees Fahrenheit.
' Current temperature is 35 degrees Fahrenheit.
using System;
public class TemperatureEventArgs : EventArgs
{
private decimal oldTemp;
private decimal newTemp;
public decimal OldTemperature
{
get { return this.oldTemp; }
}
public decimal NewTemperature
{
get { return this.newTemp; }
}
public TemperatureEventArgs(decimal oldTemp, decimal newTemp)
{
this.oldTemp = oldTemp;
this.newTemp = newTemp;
}
}
public delegate void TemperatureEventHandler(object sender, TemperatureEventArgs ev);
public class TemperatureMonitor
{
private decimal currentTemperature;
private decimal threshholdTemperature;
public event TemperatureEventHandler TemperatureThreshold;
public TemperatureMonitor(decimal threshhold)
{
this.threshholdTemperature = threshhold;
}
public void SetTemperature(decimal newTemperature)
{
if ( (this.currentTemperature > this.threshholdTemperature &&
newTemperature <= this.threshholdTemperature) ||
(this.currentTemperature < this.threshholdTemperature &&
newTemperature >= this.threshholdTemperature) )
OnRaiseTemperatureEvent(newTemperature);
this.currentTemperature = newTemperature;
}
public decimal GetTemperature()
{
return this.currentTemperature;
}
protected virtual void OnRaiseTemperatureEvent(decimal newTemperature)
{
// Raise the event if it has subscribers.
if (TemperatureThreshold != null)
TemperatureThreshold(this, new TemperatureEventArgs(this.currentTemperature,
newTemperature));
}
}
public class Example
{
public static void Main()
{
Example ex = new Example();
ex.MonitorTemperatures();
}
public void MonitorTemperatures()
{
TemperatureMonitor tempMon = new TemperatureMonitor(32);
tempMon.SetTemperature(33);
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
tempMon.GetTemperature());
tempMon.SetTemperature(32);
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
tempMon.GetTemperature());
// Add event handler dynamically using C# syntax.
tempMon.TemperatureThreshold += this.TempMonitor;
tempMon.SetTemperature(33);
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
tempMon.GetTemperature());
tempMon.SetTemperature(34);
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
tempMon.GetTemperature());
tempMon.SetTemperature(32);
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
tempMon.GetTemperature());
// Remove event handler dynamically using C# syntax.
tempMon.TemperatureThreshold -= this.TempMonitor;
tempMon.SetTemperature(31);
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
tempMon.GetTemperature());
tempMon.SetTemperature(35);
Console.WriteLine("Current temperature is {0} degrees Fahrenheit.",
tempMon.GetTemperature());
}
private void TempMonitor(object sender, TemperatureEventArgs e)
{
Console.WriteLine(" ***Warning: Temperature is changing from {0} to {1}.",
e.OldTemperature, e.NewTemperature);
}
}
// The example displays the following output:
// Current temperature is 33 degrees Fahrenheit.
// Current temperature is 32 degrees Fahrenheit.
// Current temperature is 33 degrees Fahrenheit.
// Current temperature is 34 degrees Fahrenheit.
// ***Warning: Temperature is changing from 34 to 32.
// Current temperature is 32 degrees Fahrenheit.
// Current temperature is 31 degrees Fahrenheit.
// Current temperature is 35 degrees Fahrenheit.
راجع أيضًا:
المهام
كيفية القيام بما يلي: تستهلك الأحداث في تطبيق نموذج ويب
كيفية القيام بما يلي: استهلاك الأحداث في Windows Forms Application