سؤال

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

عندما يتم النقر فوقه ، أريد تنفيذ معالج حدث Click إذا تم تعيين أحدهم ، وإلا أريد تنفيذ الإجراء الافتراضي. المشكلة هي أنه لا توجد طريقة على ما يبدو للتحقق مما إذا كان قد تمت إضافة أي معالجات إلى حدث ما.

اعتقدت أن فحصًا فارغًا في الحدث سيفعل ذلك:

if (Click == null) 
{ 
    DefaultClickAction(); 
} 
else 
{ 
    RaiseEvent(new RoutedEventArgs(ClickEvent, this));;
}

... لكن هذا لا يجمع. يخبرني المترجم أنه لا يمكنني فعل أي شيء آخر غير += أو -= إلى حدث خارج الفصل المحدد ، على الرغم من أنني أحاول إجراء هذا الشيك داخل الفصل المحدد.

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

إليك الرمز ذي الصلة:

public class MyButtonClass : Control
{
    //...

    public static readonly RoutedEvent ClickEvent =
        EventManager.RegisterRoutedEvent("Click",
                                         RoutingStrategy.Bubble,
                                         typeof(RoutedEventHandler),
                                         typeof(MyButtonClass));

    public event RoutedEventHandler Click
    {
        add { ClickHandlerCount++; AddHandler(ClickEvent, value); }
        remove { ClickHandlerCount--; RemoveHandler(ClickEvent, value); }
    }

    private int ClickHandlerCount = 0;

    private Boolean ClickHandlerExists
    {
        get { return ClickHandlerCount > 0; }
    }

    //...
}
هل كانت مفيدة؟

المحلول

لا، لم يكن ممكنا. في الواقع ، فإن الرمز الذي تفترض أنه يتعاملون مع الحدث على سيطرتك بنفسك ولكنك تعلن فقاعة الحدث ليس مباشر من الناحية الفنية ، يمكن أن يكون هناك شيء تقني يستمع إلى الحدث بشكل أكبر في سلسلة العناصر. أيضا ، من الناحية الفنية لا يحتاج المرء إلى استخدام حدث CLR لربط الحدث ؛ يمكن للمرء فقط استخدام طريقة AddHandler التي تمر مباشرة في الحدث الموجه ، وهذا ما يجب على شخص ما فعله لربط الحدث بزيادة السلسلة. أخيرًا ، لن يتم استخدام حدث CLR إذا قام شخص ما بتسجيل معالج الفصل للحدث (ليتم إخطاره كلما تم رفع هذا الحدث لأي حالة من MyButtonClass). إذا نظرت إلى شيء مثل uielement.buildRouteHelper ، فسترى جميع الخطوات التي يمر بها WPF لإنشاء مسار الحدث والكائنات التي سيتم استدعاؤها عند رفع الحدث.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top