0xDEADBEEF
0xDEADBEEF

Reputation: 3431

ShowDialog in Closing-Event

If the user closes the Application a Save-File-Message have to be shown (to be sure that he wants to discard the changes of edited files).

to implement this, i have a menuitem with a command-binding (without key-gesture):

private void Command_Exit(object sender, ExecutedRoutedEventArgs e)
{
    Application.Current.Shutdown();
}

the mainwindow has a closing-event. in this event i check if there unsaved files. if yes, the savedialog has to be opened (to choose, which files have to be saved):

private void Window_Closing(object sender, CancelEventArgs e)
    {
        if (sdl.Count() > 0)
        {
            SaveDialog sd = new SaveDialog();
            IEnumerable<Doc> close = sd.ShowDialog(this);
            if (close == null) 
                e.Cancel = true;
            else
                foreach (Doc document in close)
                    document.Save();
        }

    }

in this ShowDialog-Method (implemented in my SaveDialog-Class) i call

bool? ret = ShowDialog();
if (!ret.HasValue)
     return null;
if (!ret.Value)
     return null;

The problem is:

If i use the Alt+F4-Shortcut to close the Application (default-behaviour of the mainwindow) it works and i get the savedialog if there are unsaved files. but if i close the application by executing the Command_Exit-Method, the Method-Call

bool? ret = ShowDialog(); 

returns null and the dialog does not appear.

If i assign the Alt+F4 KeyGesture to the CommandBinding, the problem is switched: Executing Command_Exit works well but Alt+F4 Shortcut not.

What is the reason that the ShowDialog()-Method works not in both cases and how to fix it?

Upvotes: 9

Views: 4104

Answers (2)

Adam Houldsworth
Adam Houldsworth

Reputation: 64477

The Application.Current.Shutdown route allows you to listen for the shutdown request by handling the Exit event as detailed here:

http://msdn.microsoft.com/en-us/library/ms597013.aspx

It doesn't detail how it closes windows, so I wouldn't necessarily be convinced that the closing event handler would fire before it closes the application.

The other very standard way to shut the application down is to close the main window (the one shown at the very beginning). This would likely be the Window.Close method, if you are in the context of the window already, just call Close(). This will then hit the closing event handler.

Upvotes: 6

Vlad
Vlad

Reputation: 35584

Your Command_Exit implementation is wrong. Application.Current.Shutdown() means that the application is already shutting down, which can prevent the dialogs from opening.

You should implement the command other way: in the command you should ask your business logic if it's safe to shutdown, and issue Application.Current.Shutdown() only in that case. Otherwise, you should ask the business logic to start the shutdown sequence, which would in turn save the open files, and issue a Shutdown upon completing save operations.

Moreover, you should trigger the same routine when the user tries to close the main window (that is, on its Window.Closing).

Upvotes: 3

Related Questions