Программирование PC C#: как узнать, что пользователь кликнул на кнопку 'X' формы? Wed, November 13 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


C#: как узнать, что пользователь кликнул на кнопку 'X' формы? Печать
Добавил(а) microsin   

Задача - определить разные источники действий пользователя, которые приводят к закрытию формы. Например, пользователь может кликнуть на стандартной кнопке с крестиком X (которая находится в правом верхнем углу окна, на плашке), либо он может кликнуть на отдельной кнопке пользователя, обработчик которой закрывает форму.

[Событие FormClosing]

Если используются WinForms, то можно использовать событие FormClosing(). Оно срабатывает всякий раз, когда форма закрывается. Чтобы детектировать действие пользователя, когда он кликнул либо на стандартной кнопке X либо на Вашей кнопке CloseButton, можно получить информацию через объект sender. Попробуйте привести тип источника события (cast sender) как управляющий элемент кнопки (Button control), и проверьте эго имя - к примеру, равно ли оно "CloseButton".

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
   if (string.Equals((sender as Button).Name, @"CloseButton"))
   {
      // Действия, соответствующие CloseButton.
      ...
   }
   else
   {
      // Другие действия, которые приводят к закрытию формы.
      // Предположительно пользователь кликнул на кнопку 'X'.
      ...
   }
}

Закрытие формы комбинацией клавиш ALT+F4 также приведет к вызову события FormClosing(), поскольку это связано с отправкой сообщения закрытия для формы. Вы можете отменить действие события закрытия формы, если присвоите FormClosingEventArgs.Cancel = true.

Для нашего примера достаточно вставить в обработчик Form1_FormClosing следующий код:

e.Cancel = true;

Обратите внимание на различие между событиями FormClosing() и the FormClosed(). FormClosing происходит, когда форма приняла сообщение для закрытия, и в обработчике FormClosing можно выполнить некоторые действия, которые произойдут перед закрытием формы и уничтожением его экземпляра класса (в частности, можно отменить закрытие формы, как мы сделали в предыдущем примере). Событие FormClosed происходит, когда форма по-настоящему закрыта, т. е. здесь можно выполнить действия, которые произойдут после закрытия формы.

[CloseReason]

Перечисление CloseReason, описание которого можно найти в MSDN, позволяет определить, каким образом пользователем было закрыто приложение - либо при выключении компьютера, либо через Диспетчер Задач (task manager), и т. д. Чтобы дифференцировать друг от друга причины закрытия, можно использовать примерно такой код:

void Form_FormClosing(object sender, FormClosingEventArgs e)
{
   if(e.CloseReason == CloseReason.UserClosing)
   {
      // Приложение закрыл пользователь, можно предложить ему сохранить данные
      ...
   }
   if(e.CloseReason == CloseReason.WindowsShutDown)
   {
      // Автосохранение и очистка ресурсов
      ...
   }
}

Однако в этом коде нет различий между кликом на кнопке x, правым кликом на плашке и выбором в контекстном меню "Закрыть", нажатием Alt+F4, и т. п. Все это действия пользователя, так что они будут соответствовать CloseReason.UserClosing.

[DialogResult]

Кнопка "X" соответствует DialogResult.Cancel, так что это дополнительная возможность оценки результата закрытия диалога. Если на форме есть несколько кнопок, то возможно Вы можете захотеть связать разные DialogResult с каждой, и это даст дополнительную информацию для того, чтобы отличать кнопки друг от друга. Например: btnSubmit.DialogResult = DialogResult.OK, btnClose.DialogResult = Dialogresult.Abort, и т. п.

public Form1()
{
   InitializeComponent();
 
   this.FormClosing += Form1_FormClosing;
}
 
/// < summary >
/// Переопределение события Close для формы
/// < /summary >
/// < param name="sender" >< /param >
/// < param name="e" >< /param >
private void Form1_FormClosing(Object sender, FormClosingEventArgs e)
{
   //В случае, когда Windows завершает работу, мы не будем управлять процессом:
   if (e.CloseReason == CloseReason.WindowsShutDown)
      return;
 
   if (this.DialogResult == DialogResult.Cancel)
   {
      // Предположим, что кликнули на X, и выполним соответствующие действия.
      // Выдача запроса подтверждения пользователю:
      switch (MessageBox.Show(this, "Вы уверены?",
                              "Действительно хотите ... ?",
                              MessageBoxButtons.YesNo, MessageBoxIcon.Question))
      {
      case DialogResult.No:
         // Остаемся в этой форме
         e.Cancel = true;
         break;
      default:
         break;
      }
   }
}

[Ссылки]

1. How to know user has clicked X or the Close button site:stackoverflow.com.

 

Добавить комментарий


Защитный код
Обновить

Top of Page