2010-04-19 17 views
5

Voglio il tasto Esc per chiudere la finestra di WPF. Tuttavia, se c'è un controllo che può consumare quel tasto ESC, non voglio chiudere la finestra. Esistono diverse soluzioni su come chiudere la finestra WPF quando viene premuto il tasto ESC. per esempio. How does the WPF Button.IsCancel property work?Come viene gestita la chiave "Esc" nella finestra WPF?

Tuttavia, questa soluzione chiude la finestra, a prescindere dall'esistenza di un controllo attivo che può utilizzare il tasto ESC.

Ad es. Ho una finestra con un DataGrid. Una delle colonne di dataGrid è una casella combinata. Se sto cambiando il ComboBox e premuto Esc, allora il controllo dovrebbe uscire dalla modifica del comboBox (comportamento normale). E se ora colpisco di nuovo Escape, la finestra dovrebbe chiudersi. Vorrei una soluzione generica, invece di scrivere un sacco di codice personalizzato.

Se è possibile fornire una soluzione in C#, sarebbe fantastico.

risposta

3

si deve solo utilizzare l'evento KeyDown invece dell'evento PreviewKeyDown. Se un bambino di Window gestisce l'evento, non verrà fatto gorgogliare fino alla Finestra (tunnel PreviewKeyDown dallo Window inattivo) e pertanto il gestore di eventi non verrà chiamato.

+0

Questo funziona per me. Tuttavia non in tutti i casi. In particolare, sto usando il controllo DataGrid di Telerik. Se una cella ha una casella combinata, ed è espansa, quindi premo Escape, la chiave di escape non viene propagata alla finestra. Tuttavia, se il ComboBox non è espanso, ma in modalità di modifica, viene propagata la chiave di escape. Penso che potrebbe essere un bug con il controllo. Il tuo suggerimento funziona. – Markus2k

1

Potrebbe esserci un modo più semplice, ma è possibile farlo con il codice hash. Keys.Escape è un'altra opzione, ma a volte non riesco a farlo funzionare per qualche motivo. Non è stato specificato un linguaggio ecco un esempio in 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

Grazie per la risposta. La lingua che mi interessa è C#. Sto cercando una soluzione generica a questo problema. Non voglio codice specifico per ogni controllo. – 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); 
Problemi correlati