Как обрабатывается клавиша «Esc» в окне WPF? - PullRequest
5 голосов
/ 19 апреля 2010

Я хочу, чтобы клавиша Escape закрывала мое окно WPF. Однако, если есть элемент управления, который может использовать эту клавишу Escape, я не хочу закрывать окно. Существует несколько решений о том, как закрыть окно WPF при нажатии клавиши ESC. например. Как работает свойство WPF Button.IsCancel?

Однако это решение закрывает окно, независимо от того, существует ли активный элемент управления, который может использовать клавишу Escape.

Например, У меня есть окно с DataGrid. Одним из столбцов в dataGrid является комбинированный список. Если я изменяю ComboBox и нажимаю Escape, то элемент управления должен выйти из редактирования comboBox (нормальное поведение). И если я снова нажму Escape, то окно должно закрыться. Я хотел бы получить общее решение вместо того, чтобы писать много пользовательского кода.

Если бы вы могли предложить решение на C #, было бы замечательно.

Ответы [ 3 ]

3 голосов
/ 20 апреля 2010

Вы должны просто использовать событие KeyDown вместо события PreviewKeyDown. Если какой-либо дочерний элемент Window обрабатывает событие, оно не будет передано в окно (PreviewKeyDown туннели от Window вниз), и, следовательно, ваш обработчик событий не будет вызываться.

1 голос
/ 16 августа 2011
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);
1 голос
/ 19 апреля 2010

Возможно, есть более простой способ, но вы можете сделать это с помощью хеш-кода. Keys.Escape - другой вариант, но иногда я не могу заставить это работать по некоторым причинам. Вы не указали язык, поэтому вот пример в 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
...