Sdílet prostřednictvím


Architektura vstupu interoperability Windows Forms a WPF

Spolupráce mezi WPF a model Windows Forms vyžaduje, aby obě technologie měly odpovídající zpracování vstupu klávesnice. Toto téma popisuje, jak tyto technologie implementují zpracování klávesnice a zpráv, aby bylo možné bezproblémovou spolupráci v hybridních aplikacích.

Toto téma obsahuje následující pododdíly:

  • Bezmodální formuláře a dialogová okna

  • WindowsFormsHost – klávesnice a zpracování zpráv

  • ElementHost – klávesnice a zpracování zpráv

Bezmodální formuláře a dialogová okna

EnableWindowsFormsInterop Volání metody v elementu WindowsFormsHost otevřít bezmodální formulář nebo dialogové okno z aplikace založené na WPF.

EnableModelessKeyboardInterop Voláním metody na ovládacím ElementHost prvku otevřete bezmodální stránku WPF v aplikaci model Windows Forms.

WindowsFormsHost – klávesnice a zpracování zpráv

Při hostování aplikace založené na WPF se model Windows Forms zpracování klávesnice a zpráv skládá z následujících:

Následující části popisují tyto části procesu podrobněji.

Získávání zpráv ze smyčky zpráv WPF

Třída ComponentDispatcher implementuje správce smyčky zpráv pro WPF. Třída ComponentDispatcher poskytuje háky, které umožňují externím klientům filtrovat zprávy předtím, než je WPF zpracuje.

Implementace spolupráce zpracovává ComponentDispatcher.ThreadFilterMessage událost, která umožňuje model Windows Forms ovládací prvky zpracovávat zprávy před ovládacími prvky WPF.

Náhradní smyčka zpráv model Windows Forms

Ve výchozím nastavení System.Windows.Forms.Application třída obsahuje primární smyčku zpráv pro model Windows Forms aplikace. Během spolupráce smyčka model Windows Forms zpráv nezpracovává zprávy. Proto musí být tato logika reprodukována. Obslužná rutina události ComponentDispatcher.ThreadFilterMessage provádí následující kroky:

  1. Filtruje zprávu pomocí IMessageFilter rozhraní.

  2. Volá metodu Control.PreProcessMessage .

  3. V případě potřeby zprávu přeloží a odešle.

  4. Zprávu předá ovládacímu prvku hostování, pokud zprávu nezpracují žádné jiné ovládací prvky.

Implementace IKeyboardInputSink

Náhradní smyčka zpráv zpracovává správu klávesnice. Proto je metoda jediným IKeyboardInputSink členem, IKeyboardInputSink.TabInto který vyžaduje implementaci WindowsFormsHost ve třídě.

Ve výchozím nastavení HwndHost třída vrací false pro svou IKeyboardInputSink.TabInto implementaci. Tím zabráníte tabulátoru z ovládacího prvku WPF do model Windows Forms ovládacího prvku.

Implementace WindowsFormsHostIKeyboardInputSink.TabInto metody provádí následující kroky:

  1. Najde první nebo poslední model Windows Forms ovládací prvek, který ovládací prvek obsahuje WindowsFormsHost a který může přijímat fokus. Volba ovládacího prvku závisí na informacích o procházení.

  2. Nastaví fokus na ovládací prvek a vrátí .true

  3. Pokud žádný ovládací prvek nemůže přijmout fokus, vrátí .false

Registrace WindowsFormsHost

Když se vytvoří popisovač WindowsFormsHost okna ovládacího prvku, WindowsFormsHost volá ovládací prvek interní statickou metodu, která zaregistruje jeho přítomnost pro smyčku zpráv.

Během registrace WindowsFormsHost ovládací prvek zkontroluje smyčku zpráv. Pokud smyčka zpráv nebyla spuštěna, vytvoří se obslužná rutina ComponentDispatcher.ThreadFilterMessage události. Smyčka zpráv se považuje za spuštěnou ComponentDispatcher.ThreadFilterMessage při připojení obslužné rutiny události.

Když je popisovač okna zničen, WindowsFormsHost ovládací prvek se odebere z registrace.

ElementHost – klávesnice a zpracování zpráv

Při hostování aplikace model Windows Forms se zpracování klávesnice a zpráv WPF skládá z následujících:

Následující části popisují tyto části podrobněji.

Implementace rozhraní

V model Windows Forms jsou zprávy klávesnice směrovány do úchytu okna ovládacího prvku, který má fokus. V ovládacím ElementHost prvku jsou tyto zprávy směrovány na hostovaný prvek. K tomu ElementHost ovládací prvek poskytuje HwndSource instanci. Pokud má ElementHost ovládací prvek fokus, HwndSource instance směruje většinu vstupu klávesnice, aby ji mohl zpracovat třída WPF InputManager .

Třída HwndSource implementuje IKeyboardInputSink rozhraní a IKeyboardInputSite rozhraní.

Spolupráce klávesnice spoléhá na implementaci OnNoMoreTabStops metody pro zpracování vstupu klávesy TAB a šipkové klávesy, která přesune fokus mimo hostované prvky.

Klávesy Tabbing a Šipka

Logika výběru model Windows Forms je mapována na metody implementace navigace tabulátorem IKeyboardInputSink.TabIntoOnNoMoreTabStops a šipkami. Select Přepsání metody provede toto mapování.

Klávesové zkratky a klíče dialogového okna

Chcete-li wpF první příležitost zpracovat příkazové klíče a dialogové klíče, model Windows Forms příkaz předzpracování je připojen k TranslateAccelerator metodě. Control.ProcessCmdKey Přepsání metody spojuje dvě technologie.

TranslateAccelerator Pomocí této metody můžou hostované prvky zpracovávat libovolnou zprávu s klávesami, jako jsou WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN nebo WM_SYSKEYUP, včetně kláves command, jako jsou TAB, ENTER, ESC a šipkové klávesy. Pokud se nezpracuje klíčová zpráva, odešle se model Windows Forms nadřazené hierarchii pro zpracování.

Zpracování akcelerátoru

Aby bylo možné akcelerátory zpracovat správně, musí být zpracování akcelerátoru model Windows Forms připojeno ke třídě WPFAccessKeyManager. Kromě toho musí být všechny WM_CHAR zprávy správně směrovány na hostované prvky.

Vzhledem k tomu, že výchozí HwndSource implementace TranslateChar metody vrací false, WM_CHAR zprávy se zpracovávají pomocí následující logiky:

  • Metoda Control.IsInputChar se přepíše, aby se zajistilo, že se všechny WM_CHAR zprávy přeposílají do hostovaných prvků.

  • Pokud je stisknutá klávesa ALT, zpráva se WM_SYSCHAR. model Windows Forms tuto zprávu nezpracová prostřednictvím IsInputChar metody. ProcessMnemonic Proto je metoda přepsána k dotazování WPF AccessKeyManager pro registrovaný akcelerátor. Pokud se najde registrovaný akcelerátor, AccessKeyManager zpracuje ho.

  • Pokud není stisknuta klávesa ALT, třída WPF InputManager zpracuje neošetřený vstup. Pokud je vstup akcelerátorem, AccessKeyManager zpracuje ho. Událost PostProcessInput se zpracovává pro WM_CHAR zprávy, které nebyly zpracovány.

Když uživatel stiskne klávesu ALT, zobrazí se na celém formuláři vizuální upozornění akcelerátoru. Chcete-li toto chování podporovat, všechny ElementHost ovládací prvky v aktivním formuláři přijímají WM_SYSKEYDOWN zprávy bez ohledu na to, který ovládací prvek má fokus.

Zprávy se odesílají pouze ovládacím ElementHost prvkům v aktivním formuláři.

Viz také