How do I exit a WPF application programmatically?

C#.NetWpfShutdown

C# Problem Overview


How is one supposed to exit an application such as when the user clicks on the Exit menu item from the File menu?

I have tried:

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

Among many others. Nothing works.

C# Solutions


Solution 1 - C#

To exit your application you can call

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

As described in the documentation to the Application.Shutdown method you can also modify the shutdown behavior of your application by specifying a ShutdownMode:

> Shutdown is implicitly called by Windows Presentation Foundation (WPF) in the following situations: > > * When ShutdownMode is set to OnLastWindowClose. > * When the ShutdownMode is set to OnMainWindowClose. > * When a user ends a session and the SessionEnding event is either unhandled, or handled without cancellation.

Please also note that Application.Current.Shutdown(); may only be called from the thread that created the Application object, i.e. normally the main thread.

Solution 2 - C#

If you really need it to close out you can also use Environment.Exit(), but it is not graceful at all (more like ending the process).

Use it as follows:

Environment.Exit(0)

Solution 3 - C#

As wuminqi said, Application.Current.Shutdown(); is irreversible, and I believe it is typically used to force an application to close at times such as when a user is logging off or shutting down Windows.

Instead, call this.close() in your main window. This is the same as pressing Alt + F4 or the close [x] button on the window. This will cause all other owned windows to close and will end up calling Application.Current.Shutdown(); so long as the close action wasn't cancelled. Please see the MSDN documentation on Closing a Window.

Also, because this.close() is cancellable you can put in a save changes confirmation dialog in the closing event handler. Simply make an event handler for <Window Closing="..."> and change e.Cancel accordingly. (See the MSDN documentation for more details on how to do this.)

Solution 4 - C#

Use any of the following as needed:

1.

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

2.

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

Above all methods will call closing event of Window class and execution may stop at some point (cause usually applications put dialogues like 'are you sure?' or 'Would you like to save data before closing?', before a window is closed completely)

3. But if you want to terminate the application without any warning immediately. Use below

> Environment.Exit(0);

Solution 5 - C#

This should do the trick:

Application.Current.Shutdown();

If you're interested, here's some additional material that I found helpful:

http://msdn.microsoft.com/en-us/library/system.windows.application.current.aspx">Details on Application.Current

http://msdn.microsoft.com/en-us/library/ms743714.aspx#Application_Shutdown">WPF Application LifeCycle

Solution 6 - C#

Here's how I do mine:

// 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();
    }
}

I only call for Application.Current.ShutDown() from the main application window, all other windows use this.Close(). In my main window, Window_Closing(...) handles the top right x button. If any of the methods call for window closer, Window_Closing(...) grabs the event for shut down if user confirms.

The reason I do in fact use Application.Current.Shutdown() in my main window is that I've noticed that if a design mistake was made and I haven't declared a parent of one of my windows in an application, if that window is opened without being shown prior to the last active window closing, I'm left with a hidden window running in the background. The application will not shut down. The only way to prevent complete memory leak is for me to go into the Task Manager to shut down the application. Application.Current.Shutdown() protects me from unintended design flaws.

That is from my personal experience. In the end, use what is best for your scenario. This is just another piece of information.

Solution 7 - C#

There should not be an Application.ShutDown(); or .Exit() message.

Application is a static class. It does not refer to the current application. You need to get to the current application and then shut it down like this:

Application.Current.Shutdown();

Solution 8 - C#

Summarizing, there are a few ways to do that.

1) Killing the process, which skip the finalization, error handling etc.:

Process.GetCurrentProcess().Kill();

2) Shutting down current application, which is probably the proper way because it calls the exit events:

Application.Current.Shutdown();

or

this.Shutdown();

(when clled in an instance of App-class)

3) Closing current app (all forms have to be closed/finished earlier):

this.Close(); 

(when clled in an instance of App-class)

4) Exiting the environment, which terminates the app:

Environment.Exit(0);

Also, You may want to read about exit statusses here

Solution 9 - C#

Another way you can do this:

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

This will force kill your application. It always works, even in a multi-threaded application.

Note: Just be careful not to lose unsaved data in another thread.

Solution 10 - C#

According to my understanding, Application.Current.Shutdown() also has its drawback.

If you want to show a confirmation window to let users confirm on quit or not, Application.Current.Shutdown() is irreversible.

Solution 11 - C#

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);
}

Solution 12 - C#

Try

App.Current.Shutdown();

For me

Application.Current.Shutdown(); 

didn't work.

Solution 13 - C#

Caliburn micro flavoured

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 });
    }
}

Solution 14 - C#

If you want to exit from another thread that didn't create the application object, use: System.Windows.Application.Current.Dispatcher.InvokeShutdown()

Solution 15 - C#

App.Current.Shutdown();
Write that where you need to.

Solution 16 - C#

If you are using Application.Current.Shutdown() to exit the application, you may get a System.InvalidOperationException: 'The calling thread cannot access this object because a different thread owns it. if you are invoking it from a different thread. To solve this, you can wrap the call like this

Application.Current.Dispatcher.Invoke(() => Application.Current.Shutdown());

Solution 17 - C#

Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;

Solution 18 - C#

From xaml code you can call a predefined SystemCommand:

Command="SystemCommands.MinimizeWindowCommand"

I think this should be the prefered way...

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionanon271334View Question on Stackoverflow
Solution 1 - C#Dirk VollmarView Answer on Stackoverflow
Solution 2 - C#JohnView Answer on Stackoverflow
Solution 3 - C#Allen PestalukyView Answer on Stackoverflow
Solution 4 - C#Kylo RenView Answer on Stackoverflow
Solution 5 - C#Brian MacKayView Answer on Stackoverflow
Solution 6 - C#B.K.View Answer on Stackoverflow
Solution 7 - C#TimothyPView Answer on Stackoverflow
Solution 8 - C#burgundView Answer on Stackoverflow
Solution 9 - C#Ali YousefiView Answer on Stackoverflow
Solution 10 - C#wuminqiView Answer on Stackoverflow
Solution 11 - C#RaviView Answer on Stackoverflow
Solution 12 - C#Iwona KubowiczView Answer on Stackoverflow
Solution 13 - C#AndersView Answer on Stackoverflow
Solution 14 - C#Soumya MahuntView Answer on Stackoverflow
Solution 15 - C#Madhav Balakrishnan NairView Answer on Stackoverflow
Solution 16 - C#datchungView Answer on Stackoverflow
Solution 17 - C#Alpha-LIonView Answer on Stackoverflow
Solution 18 - C#Markus SommerschneeView Answer on Stackoverflow