2011-04-19 16 views
8

Tenemos una aplicación WinForms que estamos convirtiendo progresivamente a WPF. En este punto, la forma principal de la aplicación es un Formulario (WinForm) que contiene una barra lateral vertical construida en WPF. La barra lateral está alojada en un control ElementHost.Las entradas de Keybords en un control de usuario WPF no se envían al contenedor WinForms

En el formulario principal, KeyPreview se establece en verdadero y reemplazamos OnKeyDown() para procesar accesos directos de teclado de toda la aplicación. Cuando la barra lateral tiene el foco, los eventos del teclado no se envían a OnKeyDown.

¿Cuál es la forma correcta de arreglar esto?

Respuesta

7

Sí, parece que el TeclaDePresentaciónPreliminar no se consideran por ElementHost, aquí es una solución:

Derivar ElementHost y anular ProcessCmdKey, cuando el resultado base.ProcessCmdKey dice "no procesado", pasar el mensaje a los padres incluso si no es su forma principal, de esta manera su formulario principal lo recibirá porque el control de otras formas de seguridad se comportará correctamente. Aquí hay una muestra ...

public class KeyPreviewEnabledElementHost : ElementHost 
{ 
    public KeyPreviewEnabledElementHost() 
    { 
    } 

    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam); 

    protected override bool ProcessCmdKey(ref System.Windows.Forms.Message m, System.Windows.Forms.Keys keyData) 
    { 
     bool processed = base.ProcessCmdKey(ref m, keyData); 

     if (!processed) 
     { 
      SendMessage(Parent.Handle, m.Msg, m.WParam, m.LParam); 
     } 

     return processed; 
    } 
} 
1

Lo siento por la falta de respuesta, no tengo suficientes representantes para comentar. Creo que sería mejor tener una ventana de WPF como raíz y alojar el contenido de Winforms, si es posible. Sé que solucionará este problema y your other one, pero puede presentar nuevos problemas.

Cuestiones relacionadas