2010-08-30 10 views
5

Ok, no estoy seguro de entender cómo debería funcionar esto, pero en mi aplicación he vinculado un gesto de tecla (Ctrl + K) a un RoutedCommand. No importa dónde me centre en mi aplicación, la combinación de teclas funciona, excepto si la utilizo dentro de un WindowsFormsHost que contiene un control de navegador web. Intenté capturar el evento PreviewKeyDown para el control del navegador web y establecer IsInputKey en falso. Esto debería, en teoría, hacer que el Anfitrión considere el gesto clave sin tratar y lo envíe hacia arriba, pero eso no sucede.WPF WindowsFormsHost no genera gestos de teclas no tratadas

ACTUALIZACIÓN:

Si puedo reemplazar bool IsInputKey del control (Keys keyData) y return false, funciona y el comando es ejecutado como debería.

Tal vez haya algún problema en la forma en que manejé PreviewKeyDown?

private void browser_PreviewKeyDown (object sender, PreviewKeyDownEventArgs e) 
{ 
    e.IsInputKey = false; 
} 

Esperaba que esto me permitiera capturar cualquier combinación de teclas de mi ventana principal. Prefiero solucionar esto con el manejo de eventos que extender un control ...

Respuesta

0

Si lo entiendo correctamente, quiere evitar que la pulsación de teclas sea manejada por el Winform hospedado. Sin embargo, su código de ejemplo indica que intenta manejarlo dentro del control alojado.

Para manejar eventos de tunelización es mejor manejarlo "fuera" del control alojado, en el árbol visual de WPF. Puede - por ejemplo - manejarlo de la siguiente manera:

<Grid PreviewKeyDown="Grid_PreviewKeyDown" PreviewMouseDown="Grid_PreviewMouseDown" Height="250" Width="250"> 
    <WindowsFormsHost Name="windowsFormsHost1"> 
     <wf:Form1 TopLevel="False" /> 
    </WindowsFormsHost> 
</Grid> 

Al establecer el evento como se maneja de la siguiente manera, se evita que el evento se propaga más abajo en el árbol visual:

private void Grid_PreviewKeyDown(object sender, KeyEventArgs e) 
{ 
    e.Handled = true; 
} 
Cuestiones relacionadas