Определить, когда пользователь нажимает красный крестик на панели инструментов (вверху справа) - PullRequest
3 голосов
/ 14 января 2012

В приложении, которое я пишу для тестирования / изучения C #, я использую свойство hidden / visible для открытия и закрытия окон.Это приложение WPF.

В главном окне у меня есть кнопка «Закрыть», которая вызывает этот метод:

public void buttonQuit_Click(object sender, RoutedEventArgs e)
{
    var message = exitmessage;
    var title = exitTitle;
    var result = MessageBox.Show(
        message,                    // the message to show
        title,                      // the title for the dialog box
        MessageBoxButton.YesNo,     // show two buttons: Yes and No
        MessageBoxImage.Question);  // show a question mark icon

    // lets see what has been pressed
    switch (result)
    {

        case System.Windows.MessageBoxResult.Yes:   // Yes button pressed
            CloseAllWindows();
            break;

        case System.Windows.MessageBoxResult.No:    // No button pressed
            break;

        default:                 // Neither Yes nor No pressed (just in case)
            MessageBox.Show("Oh noes! What did you press?!?!");
            break;
    }
}

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

Так что на самом деле это 2 вопроса:

  1. Действительно ли CloseAllWindows(); действительно достаточно, чтобы закрыть приложение на 100%?

  2. Как «поймать» событие, когда пользователь нажимает этот красный Х на панели инструментов, и заставить его также вызвать правильное событие закрытия?

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Вы должны обрабатывать событие Closing или Closed для ваших окон. Первый позволяет отменить закрытие, а второй - просто выполнить необходимую очистку в ответ на закрытие окна.

Таким образом, в этом случае вы должны поместить код из вашего метода buttonQuit_Click в метод-обработчик, присоединенный к событию Closing, чтобы он вызывался независимо от того, как окно закрыто.

Тогда ваш buttonQuit_Click метод может просто вызвать Close метод окна . Это закроет окно, в свою очередь вызовет событие Closing и запустит ваш код в методе присоединенного обработчика.

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

App.Current.Shutdown будет работать безоговорочно.

1 голос
/ 14 января 2012

Для этого можно использовать событие закрытия окна.

Дополнительная информация http://msdn.microsoft.com/en-us/library/system.windows.window.closing.aspx

...