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. |