مشاركة عبر


نظرة عامة حول الأحداث المرفقة

Extensible Application Markup Language (XAML) يعرّف مكون لغة و نوع حدث يسمى الحدث المرفق. مفهوم الحدث المرفق يمكنّك من إضافة معالج لحدث معين إلى عنصر إجباري بدلاً من العنصر الذي يعرف بالفعل أو يرث الحدث. في هذه الحالة، لا الكائن الذي يُحتمل أن يرفع الحدث تكون و لا الوجهة المعالجة للمثيل يُعرّف أو بطريقة أخرى يملك الحدث. 

يشتمل هذا الموضوع على الأقسام التالية.

  • المتطلبات الأساسية
  • بناء جملة الحدث المرفق
  • كيفية تطبيق WPF للأحداث المرفقة
  • سيناريو الأحداث المرفقة
  • معالجة حدث مرفق في WPF
  • تعريف الأحداث المرفقة الخاصة بك المرفقة كأحداث موجه
  • رفع حدث WPF مرفق
  • موضوعات ذات صلة

المتطلبات الأساسية

يفترض هذا الموضوع أنك قرأت نظرة عامة حول الأحداث الموجهة و نظرة عامة على XAML (WPF).

بناء جملة الحدث المرفق

الأحداث المرفقة يكون لديها بناء جملة XAML و نمط الترميز الذي يجب أن يتم استخدامه من قبل التعليمة البرمجية الاحتياطية من أجل دعم استخدام الحدث المرفق.

في بناء جملة XAML, الحدث المرفق محدد ليس فقط عن طريق اسم الحدث الخاص به, و لكن بواسطة نوع المالك الخاص به بالإضافة إلى اسم الحدث مفصولين بنقطة (.). لأن اسم الحدث مؤهل مع نوع المالك الخاص به, يسمح بناء جملة الحدث المرفق أن يتم إرفاق أي حدث مرفق لأي عنصر يمكن أن يتم إنشاء مثيل له.

على سبيل المثال، التالي هو بناء جملة XAML من أجل إرفاق معالج لهذا الحدث المرفق NeedsCleaning المخصص:

<aqua:Aquarium Name="theAquarium" Height="600" Width="800" aqua:AquariumFilter.NeedsCleaning="WashMe"/>

لاحظ بادئة aqua:; البادئة ضرورية في هذه الحالة لأن الحدث المرفق حدث مخصص يأتي من تعيين xmlns مخصص.

كيفية تطبيق WPF للأحداث المرفقة

في WPF، الأحداث المرفقة يتم إجراء نسخ احتياطي بواسطة حقل RoutedEvent و إعادة توجيهها عبر الشجرة بعد أن يتم تشغيل الأحداث. بشكل عام، مصدر الحدث المرفق (الكائن الذي يرفع الحدث) هو النظام أو مصدر الخدمة، و لذلك الكائن الذي يقوم بتشغيل التعليمة البرمجية الذي يرفع الحدث ليس جزء مباشر من شجرة العنصر.

سيناريو الأحداث المرفقة

في WPF ، الأحداث المرفقة موجودة في مناطق ميزة معينة حيث يوجد تجريد مستوى الخدمة مثل الأحداث الممكنة بواسطة فئة Mouse الثابتة أو فئة Validation. الفئات التي تتفاعل مع و تستخدم الخدمة إما تستخدم الحدث في بناء جملة الحدث المرفق أو يمكنهم اختيار سطحية الحدث المرفق كحدث موجّه الذي هو جزء من كيفية تدمج الفئة قدرات الخدمة.

على الرغم من أن WPF يحدد عدد من الأحداث المرفقة, السيناريوهات حيث ستقوم باستخدام أو معالجة الحدث المرفق مباشرة هي محدودة جدًا. بشكل عام، الحدث المرفق يخدم غرض بنية و لكن بعد ذلك يتم إعادة توجيه إلى حدث موجه غير مرفق (منسوخ مع مجمّع الحدث CLR ).

على سبيل المثال، حدث Mouse.MouseDown المرفق الأساسي يمكن معالجته بسهولة أكثر على أي UIElement معطي باستخدام MouseDown على UIElement بدلاً من التعامل مع بناء جملة الحدث المرفق إما في XAML أو التعليمات البرمجية. الحدث المرفق يخدم غرض في البنية‬ لأنه يسمح للتوسيع في المستقبل لأجهزة الإدخال. يحتاج الجهاز الافتراضي لرفع Mouse.MouseDown من أجل محاكاة إدخال الماوس و لن يحتاج إلى أن ينحدر من Mouse لفعل ذلك. ومع ذلك، يشمل هذا السيناريو رمز معالجة الأحداث و معالجة XAML للحدث المرفق ليس لها صلة بهذا السيناريو.

معالجة حدث مرفق في WPF

عملية معالجة الحدث المرفق ، التعليمة البرمجية للمعالجة الذي ستكتبه, هو بشكل أساسي نفس الحدث الموجهة.

بشكل عام, أحداث WPF المرفقة هو غير مختلف جداً من حدث WPF الموجه. الاختلافات هي كيفية توريد الحدث و كيفية عرضه بواسطة فئة كعضو (الذي يؤثر أيضاً على بناء جملة معالج XAML).

على الرغم من ذلك، كما هو ملاحظ سابقاً، في الأحداث المرفقة WPF الموجودة ليست مخصصة للمعالجة في WPF. غالباً ما يكون غرض الحدث هو تمكين عنصر مركب لتقرير حالة إلى عنصر أصل في التركيب ، في هذه الحالة الحدث عادةً يتم تشغيله في التعليمات البرمجية و يعتمد أيضاً على معالجة فئة في الفئة الأصلية ذات الصلة. على سبيل المثال، العناصر داخل Selector متوقع منهم رفع حدث Selected المرفق الذي يتم معالجته من قبل فئة Selector ثم قد يتم تحويلها بواسطة فئة Selector إلى أحداث موجهة مختلفة, SelectionChanged. للحصول على مزيد من المعلومات حول الأحداث الموجهة و معالجة الفئة, راجع وضع علامة على توجيه الأحداث كمعالجة و معالجة الفئة.

تعريف الأحداث المرفقة الخاصة بك المرفقة كأحداث موجه

إذا قمت بالاشتقاق من فئات أساسية WPF شائعة, يمكنك تنفيذ الأحداث المرفقة الخاصة بك عن طريق تضمين أساليب نمط معينة في الفئة الخاصة بك بواسطة استخدام أساليب الأداة المساعدة التي تكون موجودة بالفعل على الفئات الأساسية.

النمط هو كما يلي:

  • أسلوب Add*Handler بمعلمتين. يجب أن تعرف المعلمة الأولى الحدث و الأحداث المعرفة يجب أن تتطابق مع الأسماء مع * في اسم الأسلوب. معلمة ثانية هو معالج إضافة. يجب أن يكون الأسلوب عامًا و ثابتاً، بدون أية قيمة إرجاع.

  • أسلوب Remove*Handler بمعلمتين. يجب أن تعرف المعلمة الأولى الحدث و الأحداث المعرفة يجب أن تتطابق مع الأسماء مع * في اسم الأسلوب. المعلمة الثانية هو معالج الذي سيتم إزالته. يجب أن يكون الأسلوب عامًا و ثابتاً، بدون أية قيمة إرجاع.

أسلوب ملحق Add*Handler يسهّل معالجة XAML عند تعريف سمات معالج الحدث المرفقة على العنصر. أساليب Add*Handler و Remove*Handler أيضاً تمكّن رمز الوصول إلى مخزن معالج الحدث للحدث المرفق.

هذا النمط العام غير دقيق كفاية بعد للتطبيق العملي في إطار العمل, لأن أي تطبيق قارئ XAML معطى قد يكون لديه أنظمة مختلفة لتعريف الأحداث الأساسية في دعم اللغة والبنية. هذا هو أحد الأسباب أن WPF يطبق الأحداث المرفقة كأحداث موجهة; المعرف المستخدم للحدث ( RoutedEvent) معرف مسبقاً بواسطة نظام الأحداث WPF. أيضاً، توجيه الحدث هو ملحق تطبيق طبيعي على مفهوم مستوى اللغة XAML للحدث المرفق.

تطبيق Add*Handler للحدث المرفق WPF يتكون من استدعاء AddHandler مع حدث موجّه و معالج كوسيطات.

هذا استراتيجية للتنفيذ و نظام الأحداث موجهة بشكل عام يقيد معالجة الأحداث المرفقة إلى إما فئات UIElement المشتقة أو فئات ContentElement المشتقة، لأن هذه الفئات فقط تحتوي على تطبيقات AddHandler.

على سبيل المثال، تعرّف التعليمات البرمجية التالية حدث NeedsCleaning المرفق على فئة المالك Aquarium، باستخدام استراتيجية حدث WPF المرفق من تصريح الحدث المرفق كحدث الموجّه.

Public Shared ReadOnly NeedsCleaningEvent As RoutedEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, GetType(RoutedEventHandler), GetType(AquariumFilter))
Public Shared Sub AddNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub
Public Shared Sub RemoveNeedsCleaningHandler(ByVal d As DependencyObject, ByVal handler As RoutedEventHandler)
    Dim uie As UIElement = TryCast(d, UIElement)
    If uie IsNot Nothing Then
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler)
    End If
End Sub
public static readonly RoutedEvent NeedsCleaningEvent = EventManager.RegisterRoutedEvent("NeedsCleaning", RoutingStrategy.Bubble, typeof(RoutedEventHandler), typeof(AquariumFilter));
public static void AddNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.AddHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}
public static void RemoveNeedsCleaningHandler(DependencyObject d, RoutedEventHandler handler)
{
    UIElement uie = d as UIElement;
    if (uie != null)
    {
        uie.RemoveHandler(AquariumFilter.NeedsCleaningEvent, handler);
    }
}

لاحظ أن الأسلوب المستخدم لتأسيس حقل معرف الحدث المرفق, RegisterRoutedEvent، هو بالفعل نفس الأسلوب المستخدم لتسجيل حدث موجّه غير مرفق. يتم تسجيل الأحداث المرفقة والأحداث الموجهة كافة إلى مخزن داخلي مركزي. يمكّن هذا التطبيق لمخزن الحدث اعتبار التصوري "الأحداث كواجهة" الموضح في نظرة عامة حول الأحداث الموجهة.

رفع حدث WPF مرفق

لا تكون عادةً بحاجة لرفع الأحداث المرفقة WPF المعرفة الموجودة من التعليمات البرمجية الخاصة بك. تتبع هذه الأحداث الطراز التصوري للخدمة العام و فئات الخدمة مثل InputManager هم المسؤولين عن رفع الأحداث.

ومع ذلك، إذا كنت تقوم بتعريف حدث مرفق مخصص استناداً إلى طراز WPF من الأحداث المرفقة الأساسية على RoutedEvent, يمكنك استخدام RaiseEvent لرفع حدث مرفقة من أي UIElement أو ContentElement. رفع حدث موجه (مرفقة أو لا) يتطلب تعريف عنصر معين في شجرة العنصر كمصدر الحدث; ذلك الحدث يتم الإعلام عنه كمستدعي RaiseEvent. تحديد أي عنصر يتم الإبلاغ عنه كمصدر في الشجرة هي مسؤولية الخدمة الخاصة بك

راجع أيضًا:

المبادئ

نظرة عامة حول الأحداث الموجهة

بناء جملة XAML بالتفاصيل

XAML وفئات مخصصة ل WPF