I am writing an application (c# + wpf) where all modal style dialogs are implemented as a UserControl
on top of a translucent grid covering the main Window
. This means there is only one Window
and it maintains the look and feel of all the firms applications.
To show a MessageBox
, the syntax is as following:
CustomMessageBox b = new CustomMessageBox("hello world");
c.DialogClosed += ()=>
{
// the rest of the function
}
// this raises an event listened for by the main window view model,
// displaying the message box and greying out the rest of the program.
base.ShowMessageBox(b);
As you can see, not only is the flow of execution actually inverted, but its horribly verbose compared to the classic .NET version:
MessageBox.Show("hello world");
// the rest of the function
What I am really looking for is a way to not return from base.ShowMessageBox
until the dialog closed event has been raised by it, but I cant see how it is possible to wait for this without hanging the GUI thread and thus preventing the user ever clicking OK. I am aware I can take a delegate function as a parameter to the ShowMessageBox
function which kind of prevents the inversion of execution, but still causes some crazy syntax/indenting.
Am I missing something obvious or is there a standard way to do this?
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.
Show displays the form in a non-modal way. ShowDialog displays the form in a modal way.
You might want to take a look at this article on CodeProject and this article on MSDN. The first article walks you through manually creating a blocking modal dialog, and the second article illustrates how to create custom dialogs.
The way to do this is by using a DispatcherFrame object.
var frame = new DispatcherFrame();
CustomMessageBox b = new CustomMessageBox("hello world");
c.DialogClosed += ()=>
{
frame.Continue = false; // stops the frame
}
// this raises an event listened for by the main window view model,
// displaying the message box and greying out the rest of the program.
base.ShowMessageBox(b);
// This will "block" execution of the current dispatcher frame
// and run our frame until the dialog is closed.
Dispatcher.PushFrame(frame);
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With