بنية إدخال النماذج Windows و إمكانية التشغيل التفاعلي WPF

التشغيل التفاعلي بين WPF و Windows Forms يتطلب أن يكون كلا التقنيات لديهم معالجة إدخال لوحة المفاتيح المناسبة. يصف هذا الموضوع كيفية تطبيق هذه التقنيات معالجة لوحة المفاتيح و الرسالة لتمكين تشغيل تفاعلي متجانس في تطبيقات المختلط.

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

  • النماذج غير المشروطة و مربعات الحوار

  • معالجة رسالة و لوحة مفاتيح WindowsFormsHost

  • معالجة رسالة و لوحة مفاتيح ElementHost

النماذج غير المشروطة و مربعات الحوار

استدعى أسلوب EnableWindowsFormsInterop على عنصر WindowsFormsHost لفتح مربع نموذج غير مشروط أو مربع حوار غير من تطبيق مبني علي WPF.

استدعي أسلوب EnableModelessKeyboardInterop على عنصر تحكم ElementHost لفتح صفحة WPF غير مشروطة في تطبيق مبني على Windows Forms.

معالجة رسالة و لوحة مفاتيح WindowsFormsHost

عندما تتم استضافتها من قبل تطبيق مبني على WPF، معالجة لوحة مفاتيح Windows Forms و الرسالة تتكون من التالي:

  • فئة WindowsFormsHost تكتسب الرسائل من تكرار حلقى لرسالة WPF ، الذي يتم تطبيقه بواسطة فئة ComponentDispatcher.

  • فئة WindowsFormsHost تنشئ بديل ‏‫التكرار الحلقي للرسالة Windows Forms للتأكد من حدوث معالجة لوحة المفاتيح Windows Forms العادية.

  • فئة WindowsFormsHost ينفذ واجهة IKeyboardInputSink للتنسيق بين إدارة تركيز الإحداثيات مع WPF.

  • عناصر تحكم WindowsFormsHost يقوموا بتسجيل أنفسهم و بدء ‏‫التكرار الحلقي للرسالة الخاص بهم.

تصف المقاطع التالية هذه الأجزاء من العملية بمزيد من التفاصيل.

الحصول على رسائل من ‏‫التكرار الحلقي للرسالة Windows Presentation Foundation.

فئة ComponentDispatcher تقوم بتنفيذ مدي ‏‫التكرار الحلقي للرسالة لWPF. فئة ComponentDispatcher توفر مواقع ربط لتمكين العملاء الخارجِّين لتصفية الرسائل قبل أن يقوم WPF بمعالجتهم.

تطبيق التشغيل التفاعلي يعالج حدث ComponentDispatcher.ThreadFilterMessage الذي يمكّن عناصر تحكم Windows Forms لمعالجة الرسائل قبل عناصر تحكم WPF.

بديل ‏‫التكرار الحلقي للرسالة لنماذج Windows

افتراضياً، فئة System.Windows.Forms.Application تتضمن ‏‫التكرار الحلقي للرسالة الأساسي لتطبيقات Windows Forms. أثناء التشغيل التفاعلي , ‏‫التكرار الحلقي للرسالة Windows Forms لا بعالج الرسائل. لذلك، يجب إعادة إنتاج هذا المنطق. المعالج لحدث ComponentDispatcher.ThreadFilterMessage يقوم بتنفيذ الخطوات التالية:

  1. يُصفي الرسائل باستخدام واجهة IMessageFilter.

  2. يقوم باستدعاء أسلوب Control.PreProcessMessage.

  3. يترجم ثم يرسل الرسالة، إذا كان ذلك مطلوبًا.

  4. يقوم بتمرير الرسالة إلى عنصر التحكم المضيف في حالة عدم وجود عناصر تحكم أخرى لمعالجة الرسالة.

تطبيق IKeyboardInputSink

ديل ‏‫التكرار الحلقي للرسالة يعالج إدارة لوحة المفاتيح. ولذلك، أسلوب IKeyboardInputSink.TabInto هو عضو IKeyboardInputSink الوحيد الذي يتطلب تطبيق في فئة WindowsFormsHost.

افتراضياً ، فئة HwndHost تقوم بإرجاع false إلى تنفيذ IKeyboardInputSink.TabInto الخاصة بها. يمنع هذا التبويب من عنصر تحكم WPF إلى عنصر تحكم Windows Forms.

تنفيذ WindowsFormsHost من أسلوب IKeyboardInputSink.TabInto يقوم بتنفيذ الخطوات التالية:

  1. البحث عن أول أو أخر عنصر تحكم Windows Forms الذي موجود داخل عنصر تحكم WindowsFormsHost و الذي يتلقى التركيز. يعتمد اختيار عنصر التحكم على معلومات الاجتياز.

  2. يقوم بتعيين التركيز إلى عنصر التحكم و يقوم بإرجاع true.

  3. إذا لم يمكن أن يتلقى أي عنصر تحكم التركيز ، يقوم بإرجاع false.

تسجيل WindowsFormsHost

عند إنشاء معالج إطار إلى عنصر تحكم WindowsFormsHost, عنصر تحكم WindowsFormsHost يقوم باستدعاء أسلوب ثابت داخلي الذي يسجل وجوده في ‏‫التكرار الحلقي للرسالة.

أثناء التسجيل, عنصر تحكم WindowsFormsHost يفحص ‏‫التكرار الحلقي للرسالة. إذا لم يتم بدء ‏‫التكرار الحلقي للرسالة، يتم إنشاء معالج حدث ComponentDispatcher.ThreadFilterMessage. يعتبر ‏‫التكرار الحلقي للرسالة قيد التشغيل عند إرفاق معالج حدث ComponentDispatcher.ThreadFilterMessage.

عند إتلاف معالج الإطار ، عنصر تحكم WindowsFormsHost يزيل نفسه من التسجيل.

معالجة رسالة و لوحة مفاتيح ElementHost

عندما تتم استضافتها من قبل تطبيق Windows Forms، معالجة لوحة مفاتيح WPF و الرسالة تتكون من التالي:

تصف المقاطع التالية هذه الأجزاء بمزيد من التفاصيل.

تطبيقات الواجهة

في Windows Forms ، يتم توجيه رسائل لوحة المفاتيح إلى معالج الإطار لعنصر التحكم الذي يحتوي على التركيز. في عنصر تحكم ElementHost، يتم توجيه هذه الرسائل إلي العنصر المستضاف. لإنجاز هذا, عنصر تحكم ElementHost يوفر مثيل HwndSource. إذا كان عنصر تحكم ElementHost يحتوي على التركيز, يوجه مثيل HwndSource معظم إدخال لوحة المفاتيح بحيث يمكن معالجتها بواسطة فئة WPF InputManager .

فئة HwndSourceتطبّق واجهات IKeyboardInputSink و IKeyboardInputSite.

يعتمد التشغيل التفاعلي للوحة المفاتيح على تطبيق أسلوب OnNoMoreTabStops لمعالجة إدخال مفتاح TAB و مفتاح السهم الذي يحرك التركيز خارج العناصر المستضافة.

مفاتيح السهم و التبويب

منطق اختيار Windows Forms يتم تعيينه إلي أساليب IKeyboardInputSink.TabInto و OnNoMoreTabStops لتطبيق تنقل TAB و مفاتيح السهم. تجاوز أسلوب Select يحقق هذا التعيين.

مفاتيح الأمر و مربع الحوار

لإعطاء WPF أول فرصة لمعالجة مفاتيح الأمر و مفاتيح الحوار, إعادة تشغيل أمر Windows Forms يتصل بأسلوب TranslateAccelerator. تجاوز أسلوب Control.ProcessCmdKey يتصل بتقنيتين.

مع أسلوب TranslateAccelerator, العناصر المستضافة يمكنها معالجة أي رسالة مفتاح مثل WM_KEYDOWN أو WM_KEYUP WM_SYSKEYDOWN, أو WM_SYSKEYUP بما في ذلك مفاتيح الأمر مثل TAB , ENTER , ESC، و مفاتيح السهم. إذا لم يتم معالجة رسالة المفتاح , يتم إرسالها لأعلى في تسلسل هرمي الأصل Windows Forms من أجل المعالجة.

معالجة التسريع.

لمعالجة المسرعات بشكل صحيح، يجب أن يكون معالج التسريع Windows Forms متصلاً إلي فئة WPF AccessKeyManager. بالإضافة إلى ذلك، كافة رسائل WM_CHAR يجب أن يتم توجيهها بشكل صحيح إلي العناصر المستضافة.

لأن تطبيق HwndSource الافتراضي من أسلوب TranslateChar يقوم بإرجاع false ، تتم معالجة رسائل WM_CHAR باستخدام المنطق التالي:

  • أسلوب Control.IsInputChar يتم تجاوزه للتأكد من أن يتم إعادة توجيه كافة رسائل WM_CHAR إلي العناصر المستضافة.

  • في حالة تم الضغط عليه المفتاح زر زر Alt، رسالة هو WM_SYSCHAR. Windows Formsلم preprocess هذه الرسالة من خلالIsInputCharأسلوب. لذلك، يتم تجاوز أسلوب ProcessMnemonic لاستعلام WPF AccessKeyManager للمسرعات المسجلة. إذا تم العثور على مسرع مسجل, يقوم AccessKeyManager بمعالجته.

  • إذا لم يتم الضغط على مفتاح ALT، فئة WPF InputManager تعالج الإدخال غير معالج. إذا كان الإدخال مسرع, يقوم AccessKeyManager بمعالجته. حدث PostProcessInput يتم معالجته لرسائل WM_CHAR التي لم يتم معالجتها.

عندما يضغط المستخدم مفتاح ALT ، يتم إظهار إشارات التسريع المرئية على النموذج بأكمله. لدعم هذا السلوك, كل عناصر تحكم ElementHost على النموذج النشط تلقي رسائل WM_SYSKEYDOWN بغض النظر عن أي عنصر تحكم يحتوي التركيز.

يتم إرسال الرسائل فقط إلي عناصر تحكم ElementHost في النموذج النشط.

راجع أيضًا:

المرجع

EnableWindowsFormsInterop

EnableModelessKeyboardInterop

ElementHost

WindowsFormsHost

المبادئ

الإرشادات التفصيلية: استضافة عنصر تحكم Windows Forms في WPF

الإرشادات التفصيلية: استضافة عنصر تحكم WPF في نماذج النوافذ

نظرة عامة حول التشغيل التفاعلي ل Win32 و WPF