español - ¿Cómo evito que los eventos del teclado en un cuadro de diálogo de WPF se desvanezcan en la aplicación MFC que lo invocó?
wpf tutorial (1)
Tenemos una aplicación MFC heredada que estamos ampliando con nuevas vistas y cuadros de diálogo de WPF. Estoy tratando de implementar la ayuda F1 en un cuadro de diálogo WPF que se invoca desde la ventana principal de MFC.
Inicialmente agregué un KeyBinding
al cuadro de diálogo de WPF para F1, y tuve que disparar un comando que ejecuta HtmlHelp
; algo como esto:
<Window.Resources>
<command:CommandReference x:Key="ShowF1Help" Command="{Binding ShowHelpCommand}"/>
</Window.Resources>
<Window.InputBindings>
<KeyBinding x:Name="ShowHelp" Gesture="F1" Command="{StaticResource ShowF1Help}"/>
</Window.InputBindings>
Esto abrió la Ayuda, pero desafortunadamente el evento de teclado también fue recogido por la ventana de MFC; a pesar de que el cuadro de diálogo WPF se mostraba de forma modal en la parte superior, la ventana de MFC aún recibía F1, por lo que lanzó HtmlHelp
por segunda vez, mostrando su propio tema.
Busqué una forma de marcar el evento como manejado dentro del elemento XAML/KeyBinding
, pero no tuve suerte. Así que traté de usar fuerza bruta y lo reemplacé con un controlador KeyDown
en el código subyacente, marcando el evento como manejado, así:
private void WindowKeyDown(object sender, KeyEventArgs e)
{
if (e.Key == Key.F1)
{
MyDialogVM.ShowContextSensitiveHelp();
e.Handled = true;
}
}
Esto no funcionó; el evento aún termina manejado por la ventana de MFC. También probé PreviewKeyDown
--estos resultados.
Tengo la sensación de que estoy pasando por alto algo obvio, pero parece que marcar un evento WPF como se manejó solo afecta el código WPF, y la bomba de mensajes MFC no tiene conocimiento de que el código administrado haya visto o manejado un evento de teclado determinado.
¿Hay alguna manera de evitar que los eventos de teclado que se manejan en un cuadro de diálogo WPF también sean vistos por la aplicación MFC que invocó el diálogo?
Gracias por adelantado.
Un par de preguntas: 1) ¿es el dueño del diálogo de WPF la ventana de MFC? Si no hiciste nada explícitamente, no es por defecto. 2) ¿está desactivada la ventana principal cuando el diálogo wpf está activo? Si no es así, probablemente debido al problema 1.
Necesitas algo como:
var hlpr = new System.Windows.Interop.WindowInteropHelper( xaml_window );
hlpr.Owner = mfc_window_handle;