Как выйти из всех форм клавишей «esc»? - PullRequest
0 голосов
/ 29 октября 2019

Здравствуйте, я изменяю программу WinForms. Я хотел бы сделать возможным выход из любой формы нажатием клавиши Esc.

Я пытался привязать событие к этому методу, и он работает.

private void form_KeyPress(object sender, KeyPressEventArgs e)
{
    if (e.KeyChar == (char)Keys.Escape)
    {
        this.Dispose();
    }
}

Но я хочу применить это событиедля многих форм в моем проекте, каков разумный способ избежать вставки этого метода и привязки его к событию вручную для каждой формы?

Ответы [ 2 ]

2 голосов
/ 29 октября 2019

Вы можете использовать шаблон декоратора, например:

class CustomForm : Form
{
    public CustomForm()
    {
        // automatically bind a keypress event 
        this.KeyPress += new EventHandler(form_KeyPress);
    }

    private void form_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar == (char)Keys.Escape)
        {
            this.Close(); // Close instead of disposing
        }
    }
}

И затем все формы, которые вы хотели бы иметь в этом поведении, могут наследовать от CustomForm вместо Form

1 голос
/ 29 октября 2019

Вы должны переопределить метод ProcessCommandKey базового класса Form таким образом, вызвав Close() вместо Dispose(), потому что вызов dispose не является хорошей практикой:

public partial class EscapableForm
{

  protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
  {
    switch ( keyData )
    {
      case Keys.Escape:
        Close();
        return true;
    }
    return base.ProcessCmdKey(ref msg, keyData);
  }

}

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

Таким образом, где бы ни находился пользователь, независимо от активного контроля, ключи отлавливаются, и вы можете управлять тем, что вы хотите. Вы также можете добавить любое условие UX, например, условную переменную AllowClose.

Чтобы не повторять код, вы можете создать файл пользовательского класса формы и заменить стандартный базовый класс формы, используемый Visual STudio Designer, в любом конечномФорма, подобная предложенной @ Cid.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...