Подтвердить что ты не робот

Как закрыть форму при нажатии клавиши эвакуации?

У меня небольшая форма, которая появляется, когда я нажимаю кнопку в приложении Windows Forms.

Я хочу иметь возможность закрыть форму, нажав клавишу эвакуации. Как я могу это сделать? Я не уверен в использовании события (form_closing?)?

4b9b3361

Ответ 1

Вы можете установить свойство в форме, чтобы сделать это для вас, если у вас есть кнопка в форме, которая уже закрывает форму.

Задайте CancelButton свойство формы для этой кнопки.

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

Если у вас нет кнопки отмены, вам нужно добавить обработчик KeyDown и проверить для ключа Esc следующее:

private void Form_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Escape)
    {
        this.Close();
    }
}

Вам также необходимо установить для свойства KeyPreview значение true.

Возвращает или задает значение, указывающее, будет ли форма получать ключевые события до того, как событие будет передано элементу управления, имеющему фокус.

Однако, как указывает Гарго в ответе , это будет означать, что нажатие Esc, чтобы прервать редактирование элемента управления в диалоговом окне, также будет иметь эффект закрытие диалога. Чтобы избежать переопределения метода ProcessDialogKey следующим образом:

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

Ответ 2

Лучший способ, которым я нашел, - переопределить функцию ProcessDialogKey. Этот способ отмены открытого управления по-прежнему возможен, потому что функция вызывается только тогда, когда другой элемент управления не использует нажатый Ключ.

Это то же поведение, что и при установке CancelButton. Использование события KeyDown всегда срабатывает, и форма закрывается, даже если она отменяет редактирование открытого редактора.

protected override bool ProcessDialogKey(Keys keyData)
{
    if (Form.ModifierKeys == Keys.None && keyData == Keys.Escape)
    {
        this.Close();
        return true;
    }
    return base.ProcessDialogKey(keyData);
}

Ответ 3

Если у вас есть кнопка отмены в форме, вы можете установить свойство Form.CancelButton на эту кнопку, а затем нажатие кнопки escape эффективно "нажимает кнопку".

Если у вас нет такой кнопки, проверьте свойство Form.KeyPreview.

Ответ 4

Button cancelBTN = new Button();
cancelBTN.Size = new Size(0, 0);
cancelBTN.TabStop = false;
this.Controls.Add(cancelBTN);
this.CancelButton = cancelBTN;