2010-05-12 4 views
351

За несколько лет, когда я использовал C# (WinForms), я никогда не использовал WPF. Но теперь я люблю WPF, но я не знаю, как я должен выйти из приложения, когда пользователь нажимает на пункт меню «Выход» из меню «Файл».Как выйти из приложения WPF программно?

Я пробовал:

this.Dispose(); 
this.Exit(); 
Application.ShutDown(); 
Application.Exit(); 
Application.Dispose(); 

Среди многих других. Ничего не работает.

ответ

588

Для выхода из приложения вы можете позвонить по телефону

System.Windows.Application.Current.Shutdown(); 

Как описано в документации к Application.Shutdown метода вы можете изменить поведение выключения вашего приложения, указав ShutdownMode:

Shutdown неявно вызывается Windows Presentation Foundation (WPF) в следующих ситуациях:

  • Когда ShutdownMode установлен на OnLastWindowClose.
  • Когда для параметра ShutdownMode установлено значение OnMainWindowClose.
  • Когда пользователь заканчивает сеанс, и событие SessionEnding либо необработанно, либо обрабатывается без отмены.

Пожалуйста, обратите внимание, что Application.Current.Shutdown(); можно назвать только из потока, создавших Application объекта, то есть обычно основная нить.

+6

Как я уже говорил, это не странно. В приложении WPF используется статический класс. Application.Current - это ссылка на текущее приложение. – TimothyP

+4

На мой взгляд, это немного странно в том смысле, что это не очевидно на первый взгляд, и он достаточно отличается от прошлых моделей, чтобы выбросить людей. Совершенно очевидно, что это работает. –

+0

Положите это просто: потому что, если ваше последнее окно закрыто с ... this.Close() ... Приложение будет отключено при условии, что вы не изменили ShutdownMode. – HelloSam

14

Не должно быть Application.ShutDown(); или .Exit().

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

Application.Current.Shutdown(); 
4

По моему разумению, Application.Current.Shutdown() также имеет свой недостаток,

если вы хотите чтобы показать окно подтверждения, чтобы пользователи могли подтвердить, что они ушли или нет, Application.Current.Shutdown() является необратимым.

+6

Я этого не понимаю. Мы можем получить подтверждение пользователя перед вызовом 'Application.Current.Shutdown()' однако. – Amsakanna

+1

Я не понимаю, почему вы должны подтвердить. Слишком много подтверждений - очень плохая вещь. Тот факт, что кто-то предпринял попытку щелкнуть, чтобы открыть меню «Файл», полностью отступить в нижней части меню «Файл» и затем нажать «Выход», в значительной степени подтвердил, что они больше не хотят использовать приложение. – 2010-05-13 11:09:40

+0

Veer: В моем случае окно подтверждения появляется, но даже когда вы выбираете «cancel» в подтверждении, основной APP завершается. – wuminqi

48

Как сказал wuminqi, Application.Current.Shutdown(); является необратимым, и я считаю, что он обычно используется для принудительного закрытия приложения, например, когда пользователь выходит из системы или выключает Windows. Вместо этого в главном окне вызовите this.close(). Это то же самое, что нажать «ALT-F4» или кнопку закрытия [x] в окне. Это приведет к закрытию всех остальных закрытых окон и вызовет Application.Current.Shutdown();, пока действие закрытия не будет отменено. См. Документацию MSDN по адресу Closing a Window.

Кроме того, поскольку this.close() можно отменить, вы можете поместить в диалог подтверждения изменений изменений в обработчик события закрытия. Просто сделайте обработчик событий для <Window Closing="..."> и измените значение e.Cancel соответственно. (См. MSDN doc для получения более подробной информации о том, как это сделать)

+1

+1 Я решил пойти с этим, тем более, что мне нужно сохранить открытые файлы перед тем, как выйти из приложения. – AgentKnopf

+2

Важно отметить, что Аллен указал на очень важный факт: все остальные окна будут закрыты. Вы должны убедиться, что вы объявите право собственности.Если у вас есть окно, которое запущено, а затем вы открываете другое окно, но пока не показываете его, то после закрытия активного окна скрытое окно заставит приложение продолжать работать. У вас будет потенциальная утечка памяти, если вы не закроете это окно другими средствами (диспетчер задач и т. Д.). Я проверил это. –

114

Если вам действительно нужно закрыть, вы также можете использовать Environment.Exit(), но это совсем не изящно (больше похоже на завершение процесса).

Использование следующим образом:

Environment.Exit(0) 
+3

'Environment.Exit()' требуется хотя бы один параметр, код выхода. Используйте 'Environment.Exit (0)', если вас не интересует код выхода. – gbmhunter

+19

Этот метод фактически закрыл все. Мое приложение оставляло что-то работающее (форма закрывалась, но процесс все еще работал) с 'Application.Current.Shutdown();' – gbmhunter

+1

Environment.Exit - это, безусловно, правильный способ обеспечить завершение работы приложения. С Application.Current.Shutdown вы можете легко завершить работу приложения на неопределенное время, если у вас есть код, который отталкивает себя обратно в диспетчер. –

13

Вот как я шахта:

// Any control that causes the Window.Closing even to trigger. 
private void MenuItemExit_Click(object sender, RoutedEventArgs e) 
{ 
    this.Close(); 
} 

// Method to handle the Window.Closing event. 
private void Window_Closing(object sender, CancelEventArgs e) 
{ 
    var response = MessageBox.Show("Do you really want to exit?", "Exiting...", 
            MessageBoxButton.YesNo, MessageBoxImage.Exclamation); 
    if (response == MessageBoxResult.No) 
    { 
     e.Cancel = true; 
    } 
    else 
    { 
     Application.Current.Shutdown(); 
    } 
} 

Я называю только Application.Current.ShutDown() из главного окна приложения, все остальные окна используют this.Close(). В моем главном окне Window_Closing(...) обрабатывает верхнюю правую кнопку x. Если какой-либо из методов вызывает приближение окна, Window_Closing(...) захватывает событие для завершения, если пользователь подтверждает.

Причина, по которой я действительно использую Application.Current.Shutdown(), в моем главном окне - это то, что я заметил, что если была допущена ошибка дизайна, и я не объявил родителя одного из моих окон в приложении, если это окно открыт без показа до последнего закрытия активного окна, у меня осталось скрытое окно, работающее в фоновом режиме. Приложение не будет закрыто. Единственный способ предотвратить полную утечку памяти - это зайти в диспетчер задач , чтобы закрыть приложение. Application.Current.Shutdown() защищает меня от непредвиденных недостатков дизайна.

Это из моего личного опыта. В итоге используйте то, что лучше всего подходит для вашего сценария. Это всего лишь еще одна информация.

5
private void _MenuExit_Click(object sender, RoutedEventArgs e) 
{ 
    System.Windows.Application.Current.MainWindow.Close(); 
} 

//Override the onClose method in the Application Main window 

protected override void OnClosing(System.ComponentModel.CancelEventArgs e) 
{ 
    MessageBoxResult result = MessageBox.Show("Do you really want to close", "", 
              MessageBoxButton.OKCancel); 
    if (result == MessageBoxResult.Cancel) 
    { 
     e.Cancel = true; 
    } 
    base.OnClosing(e); 
} 
-2

Очень просто, используйте код ниже

Application.Current.Shutdown(); 
+14

Вы только что скопировали код сверху, зачем вам беспокоиться? – Celt

5

Попробуйте

App.Current.Shutdown(); 

Для меня

Application.Current.Shutdown(); 

не работает.

0

Caliburn микро приправленный

public class CloseAppResult : CancelResult 
{ 
    public override void Execute(CoroutineExecutionContext context) 
    { 
     Application.Current.Shutdown(); 
     base.Execute(context); 
    } 
} 

public class CancelResult : Result 
{ 
    public override void Execute(CoroutineExecutionContext context) 
    { 
     OnCompleted(this, new ResultCompletionEventArgs { WasCancelled = true }); 
    } 
} 
21

Используйте любой из следующих по мере необходимости:

1.

App.Current.Shutdown(); 
OR 
Application.Current.Shutdown(); 

2.

App.Current.MainWindow.Close(); 
OR 
Application.Current.MainWindow.Close(); 

Над всеми методами будем называть closing event из Window класса и исполнения может остановиться в какой-то момент (обычно вызывают приложения положить диалоги как «вы уверены?' или' Вы хотите сохранить данные перед закрытием?», перед тем, как окно полностью закрыто)

3. Но если вы хотите, чтобы завершить приложение без предупреждения немедленно. Используйте ниже

Environment.Exit(0); 
0

Мы можем использовать метод this.Close() в файле MainWindow.xaml.cs, чтобы закрыть окно.

Или используйте метод App.Current.Shutdown() в файле MainWindow.xaml.cs, чтобы закрыть окно.

2

Другим способом вы можете сделать это:

System.Diagnostics.Process.GetCurrentProcess().Kill(); 

это заставит убить приложение в процессе всегда работает в многооконном приложении потоков.

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