Update: I guess, what I need is to understand what is the "correct", "supported" way to show a dialog before application start in WPF.
Here's the code:
public partial class App : Application
{
[STAThread]
public static void Main()
{
var app = new App();
app.InitializeComponent();
new DialogWindow().ShowDialog();
app.Run( new MainWindow() );
}
}
The DialogWindow
shows up as expected.
But after closing it, the application exits immediately. MainWindow
doesn't show up at all!
I have done some debugging and traced the problem to this:
- When the dialog is created, it becomes
app
's MainWindow, since there is no MainWindow at the moment. - Therefore, closing the dialog causes the application to post
ShutdownCallback
on the dispatcher queue. - However, the dispatcher doesn't run long enough to execute the callback.
- Therefore, once
app.Run
is called subsequently, the first thing on the queue isShutdownCallback
, which, naturally, causes the app to close immediately.
Given this analysis, there is an obvious workaround: create MainWindow
right after App
, thus making it app
's MainWindow, which would prevent DialogWindow
from causing application closure.
However, here is what bothers me.
First, this looks like a dirty hack to me. I mean, there is no explicit reason for creating windows in this order, and I have only found this through some debugging. This can't be the supported way.
Second, this is clearly a bug. I mean, if creating a second window after shutdown wasn't supported explicitly, it should've thrown some InvalidOperationException
, right?
Thirdly, not only is this a bug, but it looks like a very naive one, something like a multithreading beginner would create.
All this leads me to believe that maybe I don't get something fundamental here? Maybe I don't make sense at all? Maybe it all should be done in some different fashion?
Here's some background:
The application has to do some bootstrapping on startup. Check this and that, setup exception handlers, logging - you know, the usual stuff. In this process, it may become necessary to ask the user for some help - which is what the dialog is for.
I absolutely don't want to put all that in some kind of state machine that executes on MainWindow.IsVisibleChanged
or something like that. I would like to keep it really simple, short and straightforward - the way bootstrap code is supposed to be, so that it's easy to spot bugs with a naked eye.