Windows Forms ve WPF Birlikte Çalışabilirlik Giriş Mimarisi
WPF ve Windows Forms arasında birlikte çalışabilirlik, her iki teknolojinin de uygun klavye girişi işlemesine sahip olmasını gerektirir. Bu konuda, bu teknolojilerin karma uygulamalarda sorunsuz birlikte çalışabilirliği etkinleştirmek için klavye ve ileti işleme nasıl uygulandığı açıklanmaktadır.
Bu konu, aşağıdaki alt bölümleri içerir:
Modsuz formlar ve Iletişim kutuları
WindowsFormsHost klavye ve Ileti Işleme
ElementHost Klavye ve Ileti Işleme
Modsuz formlar ve Iletişim kutuları
EnableWindowsFormsInteropWindowsFormsHost WPF tabanlı bir uygulamadan kalıcı olmayan bir form veya iletişim kutusu açmak için öğesindeki yöntemi çağırın.
EnableModelessKeyboardInteropElementHost Windows Forms tabanlı bir uygulamada geçici bir WPF sayfasını açmak için denetimde yöntemi çağırın.
WindowsFormsHost klavye ve Ileti Işleme
WPF tabanlı bir uygulama tarafından barındırıldığı zaman, Windows Forms klavye ve ileti işleme aşağıdakilerden oluşur:
WindowsFormsHostSınıfı, sınıf tarafından uygulanan WPF ileti döngüsünden iletileri alır ComponentDispatcher .
WindowsFormsHostsınıfı, sıradan Windows Forms klavye işlemenin gerçekleşmesini sağlamak için bir vekil Windows Forms ileti döngüsü oluşturur.
WindowsFormsHostSınıfı, IKeyboardInputSink WPF ile odak yönetimini koordine etmek için arabirimini uygular.
WindowsFormsHostDenetimler kendilerini kaydeder ve ileti döngülerini başlatır.
Aşağıdaki bölümlerde işlemin bu bölümleri daha ayrıntılı olarak açıklanır.
WPF Ileti döngüsünden Iletiler alınıyor
ComponentDispatcherSınıfı, WPF için ileti döngüsü yöneticisini uygular. ComponentDispatcherSınıfı, dış ISTEMCILERIN WPF tarafından işlem yapılmadan önce iletileri filtrelemesine olanak tanımak için kancalar sağlar.
birlikte çalışabilirlik uygulamasının, ComponentDispatcher.ThreadFilterMessage Windows Forms denetimlerinin WPF denetimlerinden önce iletileri işlemesini sağlayan olayını işler.
vekil Windows Forms ileti 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ığın yeniden oluşturulması gerekir. ComponentDispatcher.ThreadFilterMessageOlay işleyicisi aşağıdaki adımları gerçekleştirir:
Arabirimi kullanarak iletiyi filtreler IMessageFilter .
Yöntemini çağırır Control.PreProcessMessage .
Gerekiyorsa iletiyi çevirir ve dağıtır.
İletiyi hiçbir başka denetim işleirse barındırma denetimine geçirir.
IKeyboardInputSink uygulaması
Vekil ileti döngüsü, klavye yönetimini işler. Bu nedenle, IKeyboardInputSink.TabInto yöntemi IKeyboardInputSink sınıfında bir uygulama gerektiren tek üyedir WindowsFormsHost .
Varsayılan olarak, HwndHost sınıfı falseIKeyboardInputSink.TabInto uygulamasının uygulamasına döner. bu, WPF denetiminden Windows Forms denetimine kadar sekmeye engel olur.
WindowsFormsHostIKeyboardInputSink.TabInto Yönteminin uygulanması aşağıdaki adımları gerçekleştirir:
denetimin içerdiği ve odağı alabilen ilk veya son Windows Forms denetimini bulur WindowsFormsHost . Denetim seçimi çapraz geçiş bilgilerine bağlıdır.
Odağı denetime ayarlar ve döndürür
true.Hiçbir denetim odağı alamıyorsa, döndürür
false.
WindowsFormsHost kaydı
Bir denetime yönelik pencere tutamacı WindowsFormsHost oluşturulduğunda WindowsFormsHost Denetim, ileti döngüsünün varlığını kaydeden bir iç statik yöntemi çağırır.
Kayıt sırasında WindowsFormsHost Denetim ileti döngüsünü inceler. İleti döngüsü başlatılmamışsa, ComponentDispatcher.ThreadFilterMessage olay işleyicisi oluşturulur. İleti döngüsü, olay işleyicisi eklendiğinde çalışıyor olarak kabul edilir ComponentDispatcher.ThreadFilterMessage .
Pencere tutamacı yok edildiğinde, WindowsFormsHost Denetim kendisini kayıttan kaldırır.
ElementHost Klavye ve Ileti Işleme
bir Windows Forms uygulaması tarafından barındırıldığı zaman WPF klavye ve ileti işleme aşağıdakilerden oluşur:
HwndSource, IKeyboardInputSink ve IKeyboardInputSite arabirim uygulamaları.
Sekme ve ok tuşları.
Komut tuşları ve iletişim kutusu anahtarları.
hızlandırıcı işleme Windows Forms.
Aşağıdaki bölümlerde bu parçalar daha ayrıntılı olarak açıklanır.
Arabirim Uygulamaları
Windows Forms, klavye iletileri odağa sahip olan denetimin pencere tanıtıcısına yönlendirilir. ElementHostDenetimde, bu iletiler barındırılan öğeye yönlendirilir. Bunu gerçekleştirmek için ElementHost Denetim bir HwndSource örnek sağlar. ElementHostDenetim odağa sahipse HwndSource örnek, WPF sınıfı tarafından işlenebilmesi için çoğu klavye girişini yönlendirir InputManager .
HwndSourceSınıfı IKeyboardInputSink ve IKeyboardInputSite arabirimlerini uygular.
Klavye birlikte çalışma, OnNoMoreTabStops odağı barındırılan öğelerin dışına kayan Tab 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ığı, IKeyboardInputSink.TabIntoOnNoMoreTabStops sekme ve ok tuşu gezintisi uygulamak için ve yöntemlerine eşlenir. Yöntemi geçersiz kılmak Select Bu eşlemeyi gerçekleştirir.
Komut tuşları ve Iletişim kutusu anahtarları
WPF 'e komut anahtarlarını ve iletişim anahtarlarını işlemek için ilk fırsat vermek üzere Windows Forms komut ön işlemesi TranslateAccelerator yöntemine bağlanır. Yöntemi geçersiz kılmak Control.ProcessCmdKey iki teknolojiyi bağlar.
Yöntemi ile TranslateAccelerator barındırılan öğeler, WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN veya WM_SYSKEYUP gibi komut tuşları da dahil olmak üzere, sekme, ENTER, ESC ve ok tuşları gibi herhangi bir anahtar iletisini işleyebilir. bir anahtar ileti işlenmezse, işleme için Windows Forms üst hiyerarşisi gönderilir.
Hızlandırıcı Işleme
hızlandırıcılar 'ı doğru şekilde işlemek için Windows Forms hızlandırıcı işleme WPF AccessKeyManager sınıfına bağlanmalıdır. Ayrıca, tüm WM_CHAR iletileri barındırılan öğelere doğru şekilde yönlendirilmelidir.
HwndSourceMetodun varsayılan uygulanması TranslateChar döndürdüğünden false WM_CHAR iletileri aşağıdaki mantık kullanılarak işlenir:
Control.IsInputCharTüm WM_CHAR iletilerinin barındırılan öğelere iletilmesini sağlamak için yöntemi geçersiz kılınır.
ALT tuşuna basıldığında ileti WM_SYSCHAR. Windows Forms, bu iletiyi yöntemi aracılığıyla önceden işlemez IsInputChar . Bu nedenle, ProcessMnemonic bir kayıtlı hızlandırıcı IÇIN WPF sorgulamak üzere yöntemi geçersiz kılınır AccessKeyManager . Kayıtlı bir hızlandırıcı bulunursa, AccessKeyManager onu işler.
ALT tuşuna basılsa, WPF InputManager sınıfı işlenmemiş girişi işler. Giriş bir Hızlandırıcı ise, AccessKeyManager onu işler. PostProcessInputOlay işlenmediği WM_CHAR iletiler için işlenir.
Kullanıcı ALT tuşuna bastığında Hızlandırıcı görsel ipuçları formun tamamına gösterilir. Bu davranışı desteklemek için, ElementHost etkin formdaki tüm denetimler hangi denetimin odaklandığına bakılmaksızın WM_SYSKEYDOWN iletileri alır.
İletiler yalnızca ElementHost etkin formdaki denetimlere gönderilir.