Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ShowDialog in Closing-Event

Tags:

c#

.net

wpf

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?

like image 491
0xDEADBEEF Avatar asked Apr 12 '12 13:04

0xDEADBEEF


People also ask

What is ShowDialog?

ShowDialog shows the window, disables all other windows in the application, and returns only when the window is closed. This type of window is known as a modal window. Modal windows are primarily used as dialog boxes.

What is ShowDialog C#?

ShowDialog() Shows the form as a modal dialog box. ShowDialog(IWin32Window) Shows the form as a modal dialog box with the specified owner.


2 Answers

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.

like image 135
Adam Houldsworth Avatar answered Nov 10 '22 11:11

Adam Houldsworth


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

like image 39
Vlad Avatar answered Nov 10 '22 13:11

Vlad