Windows Forms ve WPF Birlikte Çalışabilirlik Giriş Mimarisi

WPF ve Windows Forms arasında birlikte çalışma, her iki teknolojinin de uygun klavye girişi işlemesine sahip olmasını gerektirir. Bu konu başlığında, bu teknolojilerin karma uygulamalarda sorunsuz bir şekilde birlikte çalışmasını sağlamak için klavye ve ileti işlemeyi nasıl uyguladığı açıklanmaktadır.

Bu konu aşağıdaki alt bölümler içerir:

  • Modeless Forms ve Dialog Boxes

  • WindowsFormsHost Klavye ve İleti İşleme

  • ElementHost Klavyesi ve İleti İşleme

Modeless Forms ve Dialog Boxes

EnableWindowsFormsInterop WPF tabanlı bir uygulamadan modsuz bir form veya iletişim kutusu açmak için öğesinde WindowsFormsHost yöntemini çağırın.

EnableModelessKeyboardInterop Windows Forms tabanlı bir uygulamada modeless WPF sayfası açmak için denetimde yöntemini ElementHost çağırın.

WindowsFormsHost Klavye ve İleti İşleme

WPF tabanlı bir uygulama tarafından barındırıldığında, Windows Forms klavyesi ve ileti işleme aşağıdakilerden oluşur:

Aşağıdaki bölümlerde işlemin bu bölümleri daha ayrıntılı olarak açıklanmaktadır.

WPF İleti Döngüsünden İleti Alma

sınıfı WPF ComponentDispatcher için ileti döngüsü yöneticisini uygular. sınıfı, ComponentDispatcher WPF bunları işlemeden önce dış istemcilerin iletileri filtrelemesini sağlayan kancalar sağlar.

Birlikte çalışma uygulaması, Windows Forms denetimlerinin WPF denetimlerinden ComponentDispatcher.ThreadFilterMessage önce iletileri işlemesini sağlayan olayı işler.

Vekil Windows Forms İleti Döngüsü

Varsayılan olarak, System.Windows.Forms.Application sınıfı Windows Forms uygulamaları için birincil ileti döngüsünü içerir. Birlikte çalışma sırasında, Windows Forms ileti döngüsü iletileri işlemez. Bu nedenle, bu mantık yeniden oluşturulmalıdır. Olay işleyicisi ComponentDispatcher.ThreadFilterMessage aşağıdaki adımları gerçekleştirir:

  1. arabirimini kullanarak IMessageFilter iletiyi filtreler.

  2. Control.PreProcessMessage yöntemini çağırır.

  3. Gerekirse iletiyi çevirir ve sevk eder.

  4. İletiyi başka bir denetim işlemezse, iletiyi barındırma denetimine geçirir.

IKeyboardInputSink Uygulaması

Vekil ileti döngüsü, klavye yönetimini işler. Bu nedenle, IKeyboardInputSink.TabInto yöntemi sınıfında bir uygulama gerektiren tek IKeyboardInputSink üyedir WindowsFormsHost .

Varsayılan olarak, HwndHost sınıfı uygulaması IKeyboardInputSink.TabInto için döndürürfalse. Bu, WPF denetiminden Windows Forms denetimine sekmeyle geçiş yapılmasını engeller.

WindowsFormsHost yönteminin IKeyboardInputSink.TabInto uygulanması aşağıdaki adımları gerçekleştirir:

  1. Denetimin içerdiği WindowsFormsHost ve odağı alabilen ilk veya son Windows Forms denetimini bulur. Denetim seçimi, dolaşma bilgilerine bağlıdır.

  2. Odağı denetime ayarlar ve döndürür true.

  3. Hiçbir denetim odağı alamıyorsa döndürür false.

WindowsFormsHost Kaydı

Denetimin WindowsFormsHost pencere tutamacı oluşturulduğunda, denetim ileti WindowsFormsHost döngüsü için varlığını kaydeden bir iç statik yöntemi çağırır.

Kayıt sırasında denetim ileti WindowsFormsHost döngüsünü inceler. İleti döngüsü başlatılmadıysa, ComponentDispatcher.ThreadFilterMessage olay işleyicisi oluşturulur. olay işleyicisi eklendiğinde ileti döngüsünün ComponentDispatcher.ThreadFilterMessage çalıştığı kabul edilir.

Pencere tutamacı yok edildiğinde denetim kendisini WindowsFormsHost kayıttan kaldırır.

ElementHost Klavyesi ve İleti İşleme

Bir Windows Forms uygulaması tarafından barındırıldığında WPF klavyesi ve ileti işleme aşağıdakilerden oluşur:

Aşağıdaki bölümlerde bu bölümler daha ayrıntılı olarak açıklanmaktadır.

Arabirim Uygulamaları

Windows Forms'da klavye iletileri, odağı olan denetimin pencere tutamacına yönlendirilir. Denetimde ElementHost , bu iletiler barındırılan öğeye yönlendirilir. Bunu gerçekleştirmek için denetim ElementHost bir HwndSource örnek sağlar. Denetimin ElementHost odağı varsa örnek, WPF InputManager sınıfı tarafından işlenebilmesi HwndSource için çoğu klavye girişini yönlendirir.

HwndSource sınıfı ve IKeyboardInputSite arabirimlerini uygularIKeyboardInputSink.

Klavye birlikte çalışma, odağı barındırılan OnNoMoreTabStops öğelerin dışına taşıyan SEKME tuşu ve ok tuşu girişini işlemek için yöntemini uygulamaya dayanır.

Sekme ve Ok Tuşları

Windows Forms seçim mantığı, SEKME ve ok tuşu gezintisini IKeyboardInputSink.TabInto uygulamak için ve OnNoMoreTabStops yöntemlerine eşlenir. yöntemi geçersiz kılınarak Select bu eşleme gerçekleştirilir.

Komut Tuşları ve İletişim Kutusu Tuşları

WPF'ye komut anahtarlarını ve iletişim kutusu anahtarlarını işlemek için ilk fırsatı vermek için Windows Forms komut ön işleme yöntemine TranslateAccelerator bağlanır. yöntemi geçersiz kılınarak Control.ProcessCmdKey iki teknoloji birbirine bağlanır.

TranslateAccelerator yöntemiyle barındırılan öğeler, SEKME, ENTER, ESC ve ok tuşları gibi komut tuşları dahil olmak üzere WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN veya WM_SYSKEYUP gibi herhangi bir anahtar iletisini işleyebilir. Önemli bir ileti işlenmezse, işleme için Windows Forms ata hiyerarşisine gönderilir.

Hızlandırıcı İşleme

Hızlandırıcıları doğru işlemek için Windows Forms hızlandırıcısı işlemesinin WPF AccessKeyManager sınıfına bağlı olması gerekir. Ayrıca, tüm WM_CHAR iletileri barındırılan öğelere doğru şekilde yönlendirilmelidir.

yönteminin varsayılan HwndSource uygulaması döndürdüğünden TranslateCharfalse, WM_CHAR iletileri aşağıdaki mantık kullanılarak işlenir:

  • Tüm Control.IsInputChar WM_CHAR iletilerinin barındırılan öğelere iletildiğinden emin olmak için yöntemi geçersiz kılındı.

  • ALT tuşuna basıldığında ileti WM_SYSCHAR. Windows Forms bu iletiyi yöntemi aracılığıyla IsInputChar ön işlemez. Bu nedenle, ProcessMnemonic kayıtlı bir hızlandırıcı için WPF'yi AccessKeyManager sorgulamak için yöntemi geçersiz kılınmış olur. Kayıtlı bir hızlandırıcı bulunursa, AccessKeyManager bunu işler.

  • ALT tuşuna basılmazsa WPF InputManager sınıfı işlenmeyen girişi işler. Giriş bir hızlandırıcıysa, AccessKeyManager bunu işler. Olay PostProcessInput , işlenmemiş WM_CHAR iletileri için işlenir.

Kullanıcı ALT tuşuna bastığında, hızlandırıcı görsel ipuçları formun tamaminde gösterilir. Bu davranışı desteklemek için etkin formdaki tüm ElementHost denetimler, hangi denetimin odağı olduğuna bakılmaksızın WM_SYSKEYDOWN iletileri alır.

İletiler yalnızca etkin formdaki denetimlere ElementHost gönderilir.

Ayrıca bkz.