Reputation: 1845
I'm writing a WPF application and want it to start as a hidden window. I've created the Window object and set its Visibility
property to Visibility.Hidden
before calling Application.Run()
. Then, I have an event handler for Window.Loaded
that also sets the visibility to Visibility.Hidden
. Between the call to Application.Run()
and the callback to OnWindowLoaded()
, there is a black outline of the window that flashes up on the screen and then disappears. It's like the window manager is creating a drop shadow for the window or something and then hides it immediately.
After running my project through instrumentation, I finally found that Window.Show()
was somehow getting called. So, I looked into the source code at http://www.dotnetframework.org/Search.aspx:
Application.Run()
ends up calling a private method named Application.RunInternal()
.RunInternal()
checks the visibility of the Window object that was passed in to the Run()
method.Visibility
property is not Visibility.Visible
, a call to Window.Show()
is made.I then looked at the source for System.Windows.Window:
Window.Show()
sets the Visibility
property on itself (the window) to be Visibility.Visible
.Based on this, I don't see how to force the window to stay hidden. By trying to make the window invisible at startup, I'm causing the Application object to call Window.Show()
; I don't understand why the Application object even cares about the window's visibility. It's been a frustrating experience... :-(
I've seen other answers that say to not call Application.Run()
and to instead set up your own event dispatchers, but that seems like overkill for something that should be easy. I just want the main window to stay hidden, for no "flicker" to appear at app startup, and for the window to become visible when I'm ready for it to do so (which happens later in my application logic).
Can anyone offer a suggestion?
Upvotes: 3
Views: 2941
Reputation: 479
The comment on this Answer finally led me to find the solution to this issue. I needed to display multiple windows on multiple screens at once, and by minimizing the window it gives me the performance I needed. Thanks.
Upvotes: 1
Reputation: 5728
Did you remove the StartupUri
entry in App.xaml
? If you do, the App
class won't instantiate the window for you and show it. You can do this by yourself by overwriting the App.OnStartup
method.
Basically, I build a composition root in this OnStartup
method and just create a window at the end of the process:
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
// Do your custom initialization code here
MainWindow = new MainWindow();
MainWindow.Show();
}
If you really want to omit the whole application build up process (which I wouldn't recommend, as you won't have features like the fallback to Application Resources), you can create a Dispatcher
by yourself using this code:
var dispatcher = Dispatcher.CurrentDispatcher;
var synchronizationContext = new DispatcherSynchronizationContext(dispatcher);
SynchronizationContext.SetSynchronizationContext(synchronizationContext);
Dispatcher.Run();
Upvotes: 4