.Net CF يمنع النقر المفرط والصبر (أثناء إعادة رسم الشاشة)

StackOverflow https://stackoverflow.com/questions/153496

سؤال

. صافي الإطار المضغوط

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

لا أرى مكانًا جيدًا لوضع مؤشر الانتظار... لا يحدث الكثير عندما ينقر المستخدم على "لا" باستثناء إغلاق النموذج.لكن إطار عمل CF بطيء في إعادة رسم الشاشة.

أيه أفكار؟

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

المحلول

أفكار عشوائية:

  • قم بتعطيل بعض عناصر التحكم في مربع الحوار الأصلي أثناء تشغيل مربع الحوار المشروط.لا أعتقد أنه يمكنك تعطيل النموذج بأكمله لأنه أصل مربع الحوار المشروط.
  • وبدلاً من ذلك، أقترح استخدام عنصر تحكم شفاف لالتقاط النقرات ولكن الشفافية غير مدعومة في CF.
  • كم عدد عناصر التحكم الموجودة في مربع حوار الوالدين؟لم أجد CF.Net بطيئًا في التحديث.هل هناك أي فرصة لزيادة تحميل مربع الحوار وإمكانية رسمه بشكل أسرع باستخدام عناصر التحكم الفرعية؟
  • تجاوز الخاصية DialogResult وأسلوب التخلص من الفئة لمعالجة إضافة/إزالة مؤشر الانتظار.

نصائح أخرى

يمكنك تخطي النقرات المعلقة عن طريق مسح قائمة انتظار رسائل Windows باستخدام application.doevents () ؛

نستخدم فئة الأحداث المخصصة التالية لحل مشكلتك (منع النقرات المتعددة وإظهار مؤشر الانتظار إذا لزم الأمر):

using System;
using System.Windows.Forms;

public sealed class Event {

    bool forwarding;

    public event EventHandler Action;

    void Forward (object o, EventArgs a) {
        if ((Action != null) && (!forwarding)) {
            forwarding = true;
            Cursor cursor = Cursor.Current;
            try {
                Cursor.Current = Cursors.WaitCursor;
                Action(o, a);
            } finally {
                Cursor.Current = cursor;
                Application.DoEvents();
                forwarding = false;
            }
        }
    }

    public EventHandler Handler {
        get {
            return new EventHandler(Forward);
        }
    }

}

يمكنك التحقق من أنه يعمل من خلال المثال التالي (تنقر مخرجات وحدة التحكم فقط إذا تم إنهاء HandleClick):

using System;
using System.Threading;
using System.Windows.Forms;

class Program {

    static void HandleClick (object o, EventArgs a) {
        Console.WriteLine("Click");
        Thread.Sleep(1000);
    }

    static void Main () {
        Form f = new Form();
        Button b = new Button();
        //b.Click += new EventHandler(HandleClick);
        Event e = new Event();
        e.Action += new EventHandler(HandleClick);
        b.Click += e.Handler;
        f.Controls.Add(b);
        Application.Run(f);
    }

}

لإعادة إنتاج مشكلتك، قم بتغيير الكود أعلاه كما يلي (تقوم وحدة التحكم بإخراج جميع النقرات، مع تأخير):

        b.Click += new EventHandler(HandleClick);
        //Event e = new Event();
        //e.Action += new EventHandler(HandleClick);
        //b.Click += e.Handler;

يمكن استخدام فئة الحدث لكل عنصر تحكم يعرض أحداث EventHandler (Button، MenuItem، ListView، ...).

التحيات ، تامبرج

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