2010-04-19 13 views
5

Quiero que la tecla Escape cierre mi ventana WPF. Sin embargo, si hay un control que puede consumir esa tecla Escape, no quiero cerrar la ventana. Existen múltiples soluciones sobre cómo cerrar la Ventana WPF cuando se presiona la tecla ESC. p.ej. How does the WPF Button.IsCancel property work?¿Cómo se maneja la clave "Esc" en la ventana de WPF?

Sin embargo, esta solución cierra la ventana, independientemente de si hay un control activo que puede consumir la tecla Escape.

Por ej. Tengo una ventana con un DataGrid. Una de las columnas en dataGrid es un cuadro combinado. Si cambio el ComboBox y presiono Escape, entonces el control debería salir de la edición de comboBox (Comportamiento normal). Y si ahora presiono Escape nuevamente, entonces la Ventana debería cerrarse. Me gustaría una solución genérica, en lugar de escribir un montón de código personalizado.

Si puede proporcionar una solución en C#, sería genial.

Respuesta

3

que sólo debe utilizar el evento KeyDown en lugar del evento PreviewKeyDown. Si algún elemento secundario del Window maneja el evento, no aparecerá en la ventana (PreviewKeyDown túneles del Window abajo) y, por lo tanto, no se invocará el controlador de eventos.

+0

Esto funciona para mí. Sin embargo, no en todos los casos. En particular, estoy usando el control DataGrid de Telerik. Si una celda tiene un cuadro combinado, y se expande, y luego presiono Escape, entonces la tecla Escape no se propaga a la ventana. Sin embargo, si el ComboBox no está expandido, sino en el modo de edición, la clave de Escape se propaga. Creo que puede ser un error con el control. Tu sugerencia funciona – Markus2k

1

Puede haber una manera más fácil, pero podría hacerlo con el código hash. Keys.Escape es otra opción, pero a veces no puedo hacer que funcione por alguna razón. No se especificó una lengua asi que aquí hay un ejemplo en VB.NET:

Private Sub someTextField_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles someTextField.KeyPress 

    If e.KeyChar.GetHashCode = 1769499 Then ''this number is the hash code for escape on my computer, do not know if it is the same for all computers though. 
     MsgBox("escape pressed") ''put some logic in here that determines what ever you wanted to know about your "active control" 
    End If 

End Sub 
+0

Gracias por responder. El lenguaje que me interesa es C#. Estoy buscando una solución genérica a este problema. No quiero un código específico para cada control. – Markus2k

1
class Commands 
{ 
    static Command 
    { 
     CloseWindow = NewCommand("Close Window", "CloseWindow", new KeyGesture(Key.Escape)); 
     CloseWindowDefaultBinding = new CommandBinding(CloseWindow, 
      CloseWindowExecute, CloseWindowCanExecute); 
    } 

    public static CommandBinding CloseWindowDefaultBinding { get; private set; } 
    public static RoutedUICommand CloseWindow { get; private set; } 

    static void CloseWindowCanExecute(object sender, CanExecuteRoutedEventArgs e) 
    { 
     e.CanExecute = sender != null && sender is System.Windows.Window; 
     e.Handled = true; 
    } 
    static void CloseWindowExecute(object sender, ExecutedRoutedEventArgs e) 
    { 
     ((System.Windows.Window)sender).Close(); 
    } 
} 

// In your window class's constructor. This could also be done 
// as a static resource in the window's XAML resources. 
CommandBindings.Add(Commands.CloseWindowDefaultBinding); 
Cuestiones relacionadas