بيان المشكلة
كجزء من تطوير تطبيق واحد ، كان مطلوبًا تنفيذ المخطط التالي:
- طريقة غير متزامن تطلب البيانات
- يقوم المستخدم بإدخال البيانات من لوحة المفاتيح
- تستقبل الطريقة نتيجة المدخلات كنتيجة للدالة وتستمر من نفس المكان
متطلبات إضافية: لا تقم بإنشاء نوافذ إضافية.
قد يبدو بسيطا؟ اتضح أن تكون بسيطة حقا. لكن أول الأشياء أولا.
قرار
أدت المحاولة الأولى للقيام بذلك بشكل مباشر وبدون البحث على الإنترنت إلى انسداد الخيط الرئيسي ، وبالتالي لم يعد مفيدًا. وكنت على وشك استخدام ShowDialog ، حيث صادفت مقالًا . نظر المؤلف إلى كيفية عمل ShowDialog في WPF. ما تحتاجه!
في مقالته ، يقترح إنشاء تطبيقه الخاص لأسلوب ShowDialog
[DllImport("user32")] internal static extern bool EnableWindow(IntPtr hwnd, bool bEnable); public void ShowModal() { IntPtr handle = (new WindowInteropHelper(Application.Current.MainWindow)).Handle; EnableWindow(handle, false); DispatcherFrame frame = new DispatcherFrame(); this.Closed += delegate { EnableWindow(handle, true); frame.Continue = false; }; Show(); Dispatcher.PushFrame(frame); }
لا أحتاج إلى قفل نافذة ، حيث يتم عرض كل شيء في نافذة واحدة ، كما أن قيمة الإرجاع مطلوبة أيضًا. نزيل القليل جدًا ، نضيف العنصر الصحيح ...
public string GetInput() { var frame = new DispatcherFrame(); ButtonClicked += () => { frame.Continue = false; }; Dispatcher.PushFrame(frame); return Text; }
يمنع Dispatcher.PushFrame(frame)
أسلوب GetInput()
من GetInput()
حتى يصبح frame.Continue
false
. عند بدء تشغيل إطار جديد ، تتوقف الحلقة الرئيسية مؤقتًا ويبدأ إطار جديد. تعمل هذه الحلقة على معالجة رسائل النظام ، في حين أن نقطة التنفيذ في الحلقة الرئيسية لا تتحرك أكثر. عندما نخرج من الإطار الحالي ( frame.Continue = false
) ، تستمر الحلقة الرئيسية في العمل من نفس المكان.
الآن يبقى فقط للتحقق من الأداء.
في MainWindow ، قم بإنشاء زر وشنق معالجًا عليه ، مما يؤدي إلى بدء المهمة ، حيث سننتقل إلى إدخال لوحة المفاتيح.
رمز المعالج:
public RelayCommand ButtonClick => new RelayCommand(() => { Task.Factory.StartNew(() => {
لقد استخدمت هذا الحل لإدخال captcha ورمز إضافي للمصادقة ثنائية العوامل. ولكن يمكن أن يكون هناك عدد كبير من التطبيقات.
! يحتوي نموذج التعليمات البرمجية على انتهاكات مبدأ mvvm و لا تضغط بشدة التصميم المفقود
جيثب شفرة المصدر: إثبات الفكرة
روابط مفيدة
المقال "ShowDialog مخصص"
وصف هزيل للفئة DispatcherFrame باستخدام الترجمة الآلية
في انتظار الانتهاء عبر انتظار ويرد في هذه المقالة.